Tk Kommunikation mit Threads

Fragen zu Tkinter.
Antworten
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Hallo,

folgendes Szenario:

Ich habe zwei Funktionen in beiden wird per Popen eine Prozess aufgerufen.

Die erste Funktion läuft ohne Output recht lange und ich würde gerne eine Lade Animation laufen lassen, so lange die Funktion läuft.

z.b. mit

Code: Alles auswählen

Progressbar(self, orient = 'horizontal', length = 200, mode = 'indeterminate')
Ich starte die Funktion in einem Thread mit:

Code: Alles auswählen

def getMeta(self):
        t1=threading.Thread(target=getmetadata, args=(self.fname,))
        t1.start()
        t1.join()
Mein Problem ist, dass die Tk Oberfläche einfriert solange die Funktion läuft. Es sei denn ich lasse das t1.join() weg. Allerdings hat der Nutzer dann keine Möglichkeit in der Gui zu sehen das "etwas passiert".

Die zweite Funktion startet einen Prozess der Werte ausgibt die aussagen, an welchem Punkt der Verarbeitung er sich befindet.
Daher könnte ich eine progressbar erstellen, allerdings weiß ich nicht wie ich den Wert der progressbar aus dem laufenden Prozess kontinuierlich auslesen und an meine Gui senden kann.
BlackJack

@Herr Lehmann: Statt das blockierende `join()` zu vewenden könntest von der GUI regelmässig fragen ob der Thread noch läuft/lebt. Ähnlich bei dem Fortschritt. Üblicherweise kommuniziert man mit `Queue.Queue`-Objekten zwischen Threads. Da kannst Du regelmässig den Fortschritt im Arbeiter-Thread reinschreiben und im GUI-Thread regelmässig in der Queue nachsehen ob neue Werte zum Anzeigen vorliegen. Auf GUI-Seite verwendet man die `after()`-Methode ob eine Funktion/Methode zeitverzögert aufrufen zu lassen.
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Danke das hilft mir allerdings finde ich keine generellen Beispiel Code im netz im es zu implementieren. Hast du da vielleicht was?
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Hat sich erledigt. Dank der Hinweise hat es geklappt.
Antworten