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)()
Geben Sie Ihren Code immer ein! – Jonas
ich würde aber es ist einfach eine Funktion ohne Parameter mit Kopierbefehl von Shutyl. –
Löst dies Ihr Problem: http://stackoverflow.com/questions/11756802/leave-some-code-running-while-executing-more – Jonas