这里的解决方案:
from Tkinter import *
import ttk
from time import sleep
root = Tk()
def foo():
print 'starting...'
pb = ttk.Progressbar(root, mode='indeterminate')
pb.pack()
root.update()
sleep(5)
print 'stopping...'
pb.destroy()
ttk.Button(root, text="Run", command=foo).pack()
root.mainloop()
现在为什么:Tkinter的刷新它的GUI时,有一些函数调用之间的可用时间。所以,如果你想制作一个界面来显示一个巨大进程的进展,你必须周期性地调用Tk.update()方法。实际上,在你的代码中你正在做一个time.sleep(5),可以预计Tkinter会在睡眠期间更新GUI,但这是一个'主动'等待,所以tkinter GUI不会刷新。
这里有一种方法可以让用户意识到每25ms移动一次进度条就会发生一些事情。如果没有测试0.025(或其他合理的值),进度条会发疯并且移动得太快。这个想法是不使用睡眠,而是用时间代替:
from Tkinter import *
import ttk
from time import *
root = Tk()
def foo():
print 'starting...'
pb = ttk.Progressbar(root, mode='indeterminate')
pb.pack()
root.update()
start = time()
last_update= time()
while (time() - start) <= 5:
current = time()
if (current-last_update)> 0.025:
pb.step()
root.update()
last_update = current
print 'stopping...'
pb.destroy()
ttk.Button(root, text="Run", command=foo).pack()
root.mainloop()
优秀的答案,谢谢 – MFB 2014-10-20 06:51:53