2016-07-26 4 views
-1

Mein tkinter GUI-Programm läuft gut, bis es die Funktion erreicht, die angegebene Dateien zum Ziel kopiert. Danach friert es ein und ich kann nichts mehr mit meinem Programm machen, bis der Kopiervorgang beendet ist. Es funktioniert gut für kleine Dateien, aber irritiert für größere Dateien.Tkinter Gui stoppt beim Kopieren von Dateien mit shutil

Wie kann ich meine GUI beim Kopieren von Dateien reagieren lassen?

Hier ist mein Beispiel von Programm

from Tkinter import * 

root = Tk() 

def copy(): 
    copy(src, dst) 

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

..... 
.... 

root.mainloop() 
+0

Geben Sie Ihren Code immer ein! – Jonas

+0

ich würde aber es ist einfach eine Funktion ohne Parameter mit Kopierbefehl von Shutyl. –

+0

Löst dies Ihr Problem: http://stackoverflow.com/questions/11756802/leave-some-code-running-while-executing-more – Jonas

Antwort

0

Pff, hart ohne echten Code zu sagen, aber es scheint, dass Ihr Problem ist, dass tkinter GUIs müssen in der Regel ihre mainloop voll funktionsfähig sein, ausgeführt wird. Wenn Sie einen schweren Callback verwenden, stoppt Tkinter den Ereignis-Loop, der darauf wartet, dass der Callback zurückkehrt, und das Kopieren von Dateien ist aufwändig und dauert lange.

Die Lösung besteht also darin, sie so weit wie möglich von der Hauptschleife zu lösen. Die übliche Praxis besteht darin, den Kopiervorgang in einem separaten Thread zu starten. Man könnte dies mit _thread oder Gewindeschneiden, scheint die zweite einfacher zu sein:

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() 

Etwas Ähnliches, es nicht behandelt Ausnahmen kopieren (Sie Ihre eigene Logik nach Bedarf hinzufügen könnten). Und Sie sollten den Status der Sperre an anderer Stelle überprüfen, um das Ende der Operation an die GUI zu signalisieren (z. B. einen Rückruf mit Tkiter nach der Methode).

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

Vielen Dank .. es half. –