這裏的解決方案:
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