2016-11-21 11 views
3

Ich möchte einen Fortschrittsbalken, der dem Benutzer den Download-Fortschritt zeigt. Wenn die GUI aktualisiert und gleichzeitig heruntergeladen wird, friert die Fortschrittsleiste ein und ich verstehe warum, aber ich weiß nicht, wie ich sie lösen soll. Ich versuchte Multithreading mit diesem Beitrag: Tkinter: How to use threads to preventing main event loop from “freezing” und mit The Basics of Python Multithreading and Queues als Guid, um mir zu helfen, es an meine Bedürfnisse anzupassen. Das Problem ist, auf welche Weise ich versuche, mein Ziel zu erreichen, ich habe immer einen Fehler gemacht, wenn ich es ändere, um das zu tun, wozu ich es brauche.ttk Fortschrittsbalken Einfrieren

Die einfachste Version meines Codes (ohne Multithreading):

from Tkinter import * 
import ttk 
from urllib import URLopener # Downloading files 

# Make frame to tell user what file is getting downloaded 
self.Progressmsg = Label(self, text="TempValue") 
self.Progressmsg.pack(pady=(10,0)) 

# Make progress bar to show user download progress 
self.Progressbar = ttk.Progressbar(self, mode="determinate", orient='horizontal', lengt=280, maximum=len(self.AllClasses)) 
self.Progressbar.pack(padx=10, pady=10) 
self.Progressbar["value"] = 0 

def DownloadFile(Class): 
    # Update progress message 
    self.Progressmsg["text"] = "Downloading {0}.ics...".format(Class) 

    # Download each file from saxion website 
    CalFile = URLopener() 
    CalFile.retrieve("http://[school website]/ical/group/{0}.ics".format(Class), "Data/{0}.ics".format(Class)) 

    # Update progress bar 
    self.Progressbar["value"] += 1 

for Study in self.Parameters["Classes"]: 
    for Class in Study: 
     DownloadFile(Class) 

Anmerkungen: In diesem Code AllClasses ist eine Liste der verschiedenen Klassen, aus denen eine Kalender-Datei heruntergeladen werden muss.
Der Code selbst ist Teil einer ziemlich großen Klasse, die ich nicht einbezogen habe. Deshalb verwende ich self. [Variablenname]

Wenn dieser Code ausgeführt wird, wird die Fortschrittsanzeige nicht geladen oder aktualisiert, alle Dateien werden ordnungsgemäß heruntergeladen und beim Herunterladen wird die Fortschrittsleiste auf einmal aktualisiert. Meine Frage ist: Wie löse ich dieses Problem in meinem Fall?

Antwort

3

Versuchen Sie folgendes:

# Update progress bar 
self.Progressbar["value"] += 1 
self.Progressbar.update_idletasks() 

Wenn nicht, dann self.Progressbar.update() stattdessen funktioniert.

Die GUI wird Ihre Änderungen nicht wiedergeben, wenn etwas anderes zu tun ist (z. B. das Herunterladen der nächsten Datei), sofern Sie nicht update_idletasks() oder update() anrufen.