如何循环更新进度条?

Posted

技术标签:

【中文标题】如何循环更新进度条?【英文标题】:How to update a progress bar in a loop? 【发布时间】:2016-07-30 17:09:03 【问题描述】:

循环更新Tkinter进度条的简单方法是什么?

我需要一个没有太多混乱的解决方案,所以我可以在我的脚本中轻松实现它,因为它对我来说已经相当复杂了。

假设代码是:

from Tkinter import *
import ttk


root = Tk()
root.geometry('x'.format(400, 100))
theLabel = Label(root, text="Sample text to show")
theLabel.pack()


status = Label(root, text="Status bar:", bd=1, relief=SUNKEN, anchor=W)
status.pack(side=BOTTOM, fill=X)

root.mainloop()

def loop_function():
    k = 1
    while k<30:
    ### some work to be done
    k = k + 1
    ### here should be progress bar update on the end of the loop
    ###   "Progress: current value of k =" + str(k)


# Begining of a program
loop_function()

【问题讨论】:

【参考方案1】:

这是一个持续更新ttk 进度条的快速示例。您可能不想将sleep 放在GUI 中。这只是为了减慢更新速度,以便您可以看到它的变化。

from Tkinter import *
import ttk
import time

MAX = 30

root = Tk()
root.geometry('x'.format(400, 100))
progress_var = DoubleVar() #here you have ints but when calc. %'s usually floats
theLabel = Label(root, text="Sample text to show")
theLabel.pack()
progressbar = ttk.Progressbar(root, variable=progress_var, maximum=MAX)
progressbar.pack(fill=X, expand=1)


def loop_function():

    k = 0
    while k <= MAX:
    ### some work to be done
        progress_var.set(k)
        k += 1
        time.sleep(0.02)
        root.update_idletasks()
    root.after(100, loop_function)

loop_function()
root.mainloop()

【讨论】:

使用root.update_idletasks() 会使窗口无响应。但是root.update() 不会使窗口无响应。 @skarfa:不,在 tkinter gui 程序中调用 time.sleep() 会导致它没有响应(因为它会暂时挂起 gui 的 mainloop)。 OP 在他们的描述中提到了这一点。

以上是关于如何循环更新进度条?的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask 和进度条 [重复]

mfc编写一个flash播放器slider进度条的程序,在新建线程中,怎么实现进度条的更新

Symfony Ajax 进度条

尝试从外部脚本更新进度条时,QWidget 变得无响应[重复]

如何根据嵌套循环中的多个变量报告进度(对于进度条)?

java实现进度条