2011-04-30 101 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