Nein, es kann nicht auf diese Weise gemacht werden, weil shutil.copy
keine Möglichkeit hat, den Fortschritt zu liefern.
Aber Sie können Ihre eigene Kopierfunktion (oder sogar Gabel den Code aus shutil
--notice schreiben, dass es eines der Module ist, die einen Link zu the source an der Spitze enthält, es soll Sinn für Beispielcode als nützlich sein als für nur verwenden, wie es ist). Ihre Funktion kann z. B. eine Fortschrittsrückruffunktion als zusätzliches Argument annehmen und sie nach jedem Puffer (oder jedem N Puffer oder jedem N Byte oder jedem N Sekunden) aufrufen. Etwas wie:
def copy(src, dst, progress):
# ...
for something:
progress(bytes_so_far, bytes_total)
# ...
progress(bytes_total, bytes_total)
Jetzt wird dieser Callback immer noch im Hintergrund Thread, nicht der Haupt-Thread aufgerufen werden. Bei den meisten GUI-Frameworks bedeutet dies, dass GUI-Widgets nicht direkt berührt werden können. Aber die meisten GUI-Frameworks haben die Möglichkeit, eine Nachricht von einem Hintergrundthread an die Ereignisschleife des Hauptthreads zu senden, also machen Sie das Callback einfach. Mit Qt machen Sie das mit Signalen und Slots, genauso wie Sie es im Hauptthread tun; Es gibt viele großartige Tutorials, wenn Sie nicht wissen, wie.
Alternativ Sie es die Art und Weise tun, könnten Sie vorgeschlagen: haben die Haupt-Thread die Hintergrund-Thread-Signal (zB durch eine queue.Queue
veröffentlichen oder eine Event
oder Condition
Triggerung) für dieses Signal und haben Ihre copy
Funktionsprüfung jedes Mal durch die Schleife und reagieren. Aber das scheint sowohl komplizierter als auch weniger ansprechend zu sein.
Noch eine Sache: Qt hat seine eigene Threading-Bibliothek, und Sie können sie anstelle von Pythons nativen verwenden, weil Sie einen Slot direkt an QThread
-Objekt anfügen können und das zu Ihrem Rückruf machen. Ich bin mir nicht sicher, aber Qt könnte sogar irgendwo eine eigene Datei-Copy-with-Progress-Methode haben; sie versuchen, alles zu wickeln, das zwischen Plattformen und vage verwandt mit GUIs überhaupt unterschiedlich sein könnte.
Hey, ich denke, dass ich Ihre endgültige Lösung gefunden: https://fredrikaverpil.github.io/2015/05/12/file-copy-progress-window-with-pyqt-pyside-and-shutil/. Gutes Zeug! – flutefreak7