微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Tcl/Tk:如何在运行代码的同时创建进度条?

如何解决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。这两种选择都有其棘手的方面:

  1. 当使用单独的工作线程时,该线程不得完全接触 GUI。相反,它必须向 GUI 线程发送消息,要求它进行更新。
  2. 在使用定期 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 举报,一经查实,本站将立刻删除。