如何解决Tcl/Tk:如何在运行代码的同时创建进度条?
proc foo {} {
# do something
# sleep for 5sec
# do something
# sleep for 5sec
# do something
}
我希望只要我们输入 foo,progressbar 就会出现并水平运行, 随着 foo 代码也应该运行, 随着 foo 中的所有内容完成,progressbar 应该水平显示 100% 并消失。
怎么做?
解决方法
您要查找的小部件是 ttk::progressbar
(Tcl) 或 tkinter.ttk.Progressbar
(Python)。您需要决定是在确定模式还是不确定模式下使用它等等。
使用进度条有一个关键的棘手问题:您需要在显示它时保持事件循环运行。这意味着您需要将在单独的线程中工作或定期调用 update
。这两种选择都有其棘手的方面:
- 当使用单独的工作线程时,该线程不得完全接触 GUI。相反,它必须向 GUI 线程发送消息,要求它进行更新。
- 在使用定期
update
调用(通常每四分之一秒左右一次就足够了)时,您需要非常小心不要递归地进入完整的事件循环处理(请参阅{{3} } 进行讨论)。这通常涉及在处理过程中执行诸如禁用按钮之类的操作。
你是不是在终端中的进度条之后,那些相对简单,因为你不必管理事件循环;终端本身会为您做到这一点。
,如果您很清楚完成您必须做的事情所需的时间,您可以使用 after 命令定期更新进度条。
# pop up progress bar for a calibration that takes 20 seconds
toplevel .progress
label .progress.calib -text "Calibrating ..."
ttk::progressbar .progress.bar \
-variable ::progress \
-length 300
grid .progress.calib
grid .progress.bar
wm geometry .progress +180+180
#
# wait 20 seconds and update the progress every 0.5 s
#
set wait_time 20000
# use a variable to wait until the progressbar is complete
after 20100 "destroy .progress"
# create updates every 0.5 second
for {set i 500} {$i <= $wait_time} {incr i 500} {
after $i "set ::progress [expr $i*100/$wait_time]"
}
# do your stuff in less than 20 seconds
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。