2014-10-20 51 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