2014-12-03 77 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()

相關問題