2014-10-20 113 views
0

下面的代码用按钮创建了一个Tkinter根窗口。该按钮绑定到一个简单的函数,该函数应该暂时显示一个进度条小部件。在打印语句按预期运行时,进度条从不显示。任何线索?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

这里的解决方案:

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() 
+0

优秀的答案,谢谢 – MFB 2014-10-20 06:51:53