2011-04-30 99 views
1

當我運行它時,它只顯示完成下載後的百分比,所以有什麼辦法讓它在下載時顯示?列表框更新

listbox = Listbox(Admin) 
listbox.grid(row=19, column=9) 
def download0(runums, song): 

    chunks = 10000 
    dat = '' 
    runum = runums.replace(' ', '%20') 
    url = runum 
    down = urlopen(url) 
    downso = 0 
    tota = down.info().getheader('Content-Length').strip() 
    tota = int(tota) 
    while 1: 
     a = down.read(chunks) 
     downso += len(a) 

     if not a: 
      break 
     dat += a 
     percent = float(downso)/tota 
     percent = round(percent*100, 1) 

     sys.stdout.write(str(percent)) 
     sys.stdout.flush() 

     sys.stdout.write("\b"*4) 
     listbox.insert(END, percent) 
+0

最簡單的方法通常是將下載到一些線索,或使用基於選擇一些基於事件的下載()(例如扭曲的)來保持事件循環活着。 – schlenk 2011-04-30 10:36:27

回答

1

Tkinter事件循環(由mainloop()開始)在單個線程上運行。它旋轉,對事件作出反應(例如鼠標點擊),重新繪製小部件等等。點擊一個按鈕開始下載時,控制權將傳遞給您的download0()函數。在控制權返回到事件循環之前,除非您告訴他們,否則不會重新繪製小部件。

所以在下載過程中,你需要告訴控件重繪自身:

listbox.insert(END, percent) 
listbox.update_idletasks() 
+0

你應該**絕對不**使用'update'。相反,使用'update_idletasks'。爲什麼? 'update'可能會對用戶事件做出響應。如果這些用戶事件再次調用這個相同的函數,你會遇到問題。 'update_idletasks'是安全的,因爲它只響應「空閒」事件,比如重畫屏幕。 – 2011-04-30 21:48:52

+0

好點@bryan,將它改爲widget.update_idletasks。 – samplebias 2011-04-30 22:08:57