下面的代码创建了一个带按钮的Tkinter根窗口。该按钮绑定到一个简单的函数,该函数应该暂时显示进度条小部件。虽然打印语句按预期运行,但从不显示进度条。有线索吗?
from Tkinter import *
import ttk
from time import sleep
root = Tk()
def foo():
print 'starting...'
pb = ttk.Progressbar(root, mode='indeterminate')
pb.pack()
sleep(5)
print 'stopping...'
pb.destroy()
ttk.Button(root, text="Run", command=foo).pack()
答案 0 :(得分:0)
这里是解决方案:
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()