2016-07-26 47 views
-1

我的tkinter GUI程序運行正常,直到達到將指定文件複製到目標的功能。之後,它凍結,我的程序無法做任何事情,直到複製完成。它適用於小文件,但會激怒較大的文件。Tkinter Gui在使用shutil複製文件時停止

如何在複製文件時讓GUI響應?

這裏是我的程序

from Tkinter import * 

root = Tk() 

def copy(): 
    copy(src, dst) 

if something: 
    copy() 
else:  
    something... 

..... 
.... 

root.mainloop() 
+0

始終發佈您的代碼! – Jonas

+0

我會,但它只是一個函數沒有參數從shutil複製命令。 –

+0

這是否解決您的問題:http://stackoverflow.com/questions/11756802/leave-some-code-running-while-executing-more – Jonas

回答

0

PFF,很難說沒有實際的代碼樣本,但似乎你的問題是,Tkinter的圖形用戶界面通常需要他們的主循環運行全面投入運作。 當你使用一個沉重的回調,tkinter停止等待回調返回的事件循環,文件複製是沉重的和長時間的操作。

因此,解決方案是儘可能將它從主循環中分離出來。通常的做法是在單獨的線程中產生複製操作。你可以用_Thread或線程這樣做,第二個似乎是簡單的:

def copy_callback(from_, to, lock): 
    th = threading.Thread(target=copy_thread, args=(from_, to, lock)) 
    th.start() 


def copy_thread(from_, to, lockobj): 
    with lockobj: 
     shutil.copy(from_, to) 

root = tkinter.Tk() 
lock = threading.Lock() # this one monitores finish of copy operation 
tkinter.Button(root, text='start copy', command=lambda: copy_callback(src, dst, lock)).pack() 
root.mainloop() 

這樣的事情,它不處理複製的例外(如果需要,你可以添加自己的邏輯)。並且您應該檢查其他位置的鎖的狀態以向GUI發信號通知操作結束(例如,使用tkiter的after方法檢查回調)

def check_callback(inst, lock, waittime): 
    def check(): 
     if lock.acquire(blocking=False): 
      inst['text'] = 'Success!' 
      lock.release() 
     else: 
      inst.after(waittime, func=check) 
    return check 

l = tkinter.Label(root, text='Copying...') 
l.pack() 
check_callback(l, lock, 100)() 
+0

非常感謝你..它幫助。 –