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)()
始終發佈您的代碼! – Jonas
我會,但它只是一個函數沒有參數從shutil複製命令。 –
這是否解決您的問題:http://stackoverflow.com/questions/11756802/leave-some-code-running-while-executing-more – Jonas