2014-12-03 97 views
0

我在制作一个下载文件的Python程序。我使用Tkinter作为GUI,但它冻结时下载较大的文件,停止显示缓冲区。我尝试使用线程,因为它在S.O.的类似问题中提出。但没有任何改变。这里是代码:即使使用线程,Tkinter窗口也会冻结

labelText1 = StringVar() 
labelText1.set("Double-click file to download...") 
label11 = Label(app, textvariable=labelText1, height=2, bg="#DF1A2B", fg="white") 
label11.place(x=50, y=50) 

def download_file(url): 
    file_name = url.split('/')[-1] 
    u = urllib2.urlopen(url) 
    f = open("./downloads/" + file_name, 'wb') 
    meta = u.info() 
    file_size = int(meta.getheaders("Content-Length")[0]) 
    print "Downloading: %s" % (file_name) 
    os.system('cls') 
    file_size_dl = 0 
    block_sz = 8192 
    while True: 
     buffer = u.read(block_sz) 
     if not buffer: 
      break 

     file_size_dl += len(buffer) 
     f.write(buffer) 
     status = r"%10d [%3.2f%%]" % (file_size_dl, file_size_dl * 100./file_size) 
     status = status + chr(8)*(len(status)+1) 
     labelText1.set(status,) 
     tuple = (file_name, status) 
    f.close() 
    onEnd() 

def onEnd(): 
    labelText1.set("Status: done!") 

def double_clicked(clicked): 
    tuple = mlb.get(clicked)[0] 
    url = str(tuple[2]) 
    if tuple[1] != "Folder": 
     t = threading.Thread(target=download_file(url)) 
     t.start() 
    else: 
     print "FOLDER HANDLING GOES HERE" 

是否有任何其他方式可以让我在下载过程仍在运行时更改标签文本?

+1

如果在while循环期间刷新GUI,会发生什么情况,例如,使用'update()'? – 101 2014-12-03 22:27:42

+0

您可能需要'while true:'循环中的'time.sleep()'调用,如[此问题的代码]所示(http://stackoverflow.com/questions/24216760/multithreaded-file-download-in-蟒和更新管理在壳与下载-逐行?RQ = 1)。 – martineau 2014-12-03 22:30:21

+0

@figs这实际上解决了问题!现在图形用户界面正在更新正常...您能否将此作为答案,以便我可以接受它? – 2014-12-03 22:35:46

回答

0

仅仅因为它在一个单独的线程中,如果GUI中有很长一段代码(例如while循环),它仍然可以“挂起”。在while循环期间添加GUI刷新,以便有机会重画,例如使用update()

相关问题