0

Ich versuche eine GUI zu erstellen, wo der Benutzer auf eine Schaltfläche klickt und die App eine Datei aus dem Internet herunterlädt. Ich möchte einen Fortschrittsbalken haben, der anzeigt, wie lange der Download der Datei abgeschlossen ist. Um dies zu erreichen, habe ich einen Thread implementiert, um die Funktion des Fortschrittsbalkens auszuführen, wenn auf den Download-Button geklickt wird. Hier ist der Code Ich verwende:Download Fortschrittsbalken funktioniert nicht, Python 3

def progthread(): 
    threading.Thread(target=download).start() 

def download(): 
    blocknum = 0 
    blocksize = 0 
    url = "https://www.python.org/static/img/python-logo.png" 
    filename = "C:\My Python Apps\MyFile.png" 
    response = requests.get(url, stream=True) 
    total_length = response.headers.get('content-length') 

    with open(filename, "wb") as f: 
     for data in response.iter_content(chunk_size=10000): 
      f.write(data) 
      percent = int(blocknum * blocksize/int(total_length)) 

      progress['value'] = percent 

Wenn ich die Anwendung ausführen, es lädt die Datei und keine Fehler kommen. Aber der Fortschrittsbalken tut nichts. Ich versuchte mit progress.update() und progress.update_idletask() aber der Fortschrittsbalken funktionierte immer noch nicht.

Wie kann ich die Fortschrittsleiste erhalten, um den Download-Fortschritt der Datei anzuzeigen?

+0

Sie haben Blocknum und blocksize innerhalb der Schleife keine Werte zugewiesen, also bleiben sie immer bei 0. –

Antwort

1

Das Problem ist, dass die Schleife Sie tkinter Hauptschleife blockiert, so dass die gesamte GUI blockiert. Für so etwas sollten Sie den Download-Loop in einem separaten Thread starten, damit er gleichzeitig mit dem tkinter-Mainloop ausgeführt werden kann. Sie können einen tkinter IntVar verwenden, um den Fortschrittsbalken vom anderen Thread zu aktualisieren.

Wenn Sie Ihre Frage mit einem Minimal, Complete, and Verifiable example aktualisieren, dann kann ich Ihnen helfen, das zu implementieren.

+0

Ich bin mir nicht sicher, wie ich es jedoch minimal machen sollte. Die andere Version dieses Codes, die ich ausprobierte und verwendet, verwendet das 'urllib'-Paket, aber ich weiß, dass viele Websites 403-Fehler auslösen, wenn dies verwendet wird. Das Beispiel, das ich in der Frage angegeben habe, ist das, was ich verwendet habe, um' urllib nicht zu verwenden '. Aber wie würde ich die Download-Schleife in einen separaten Thread legen? – RedCode

+0

Okay, ich habe herausgefunden, wie man Threading durchführt und meine Frage aktualisiert, aber das Problem bleibt bestehen. Ich weiß ehrlich gesagt nicht, wie ich mein Beispiel aber minimal machen kann, aber ich denke jetzt, ich denke, es könnte ein Problem sein, die Blockgröße beim Herunterladen zu bekommen, denn in meinem 'urllib'-Code bekommt es diesen Wert und gibt es zurück, aber ich kann es nicht auf die gleiche Weise implementieren, während ich das Paket 'requests' verwende. – RedCode

+0

Ich will nicht, dass du es nur minimal machst, aber make ist komplett und überprüfbar. Lesen Sie den Link. Dies ist üblich, wenn Sie online nach Hilfe fragen. Erstellen Sie ein vollständiges Programm, das ich ausführen kann, einschließlich Importe, damit ich Ihnen zeigen kann, wo das Problem liegt. Sicher könnte ich das selbst machen; aber ich habe bessere Dinge zu tun, als den Code zu schreiben. – Novel

Verwandte Themen