GUI stoppt wenn main.after zuviel Zeit benötigt

Fragen zu Tkinter.
Antworten
marcia
User
Beiträge: 14
Registriert: Freitag 16. März 2012, 15:36

Hallo,

eine Funktion die per main.after gestartet wird, benötigt mehrere Sekunden (> 100 Sekunden) zur Ausführung. Wärend dieser Zeit friert die GUI ein.

Der Ansatz ist mir klar.Mit main.after(... soll eine Funktion nach einem timeout von x ms gestartet werden. Diese Funktion sollte nach Möglichkeit so gestaltet werden, das sie wenig Systemzeit benötigt. Also eher zehnmal aufgerufen werden muß um eine Aufgabe zu erledigen, statt einmal aufgerufen zu werden und das zehnfache an Zeit zu benötigen. Weil eben die GUI solange einfriert.

Die Funktion die ich per main.after aufrufe, liest Daten aus einer Datei und übergibt diese an einen Server (arbeite mit urllib). Also etwas was schon allein wegen des Protokolloverheads nicht in einzelne kleine Schritte zerlegt werden sollte.

Inzwischen habe ich mit main.after bzw. frame1.after und auch after_idle experimentiert. Die GUI friert aber immer ein. Bleibt hier nur der Weg mit thread zu arbeiten und eine Queue für die Fortschritsanzeige zu verwenden?

Hier im Forum habe ich gesucht, natürlich auch mit google. Mir fehlen offensichtlich die richtigen Schlagworte/Suchbegriffe. Ich denke mein Problem ist nicht neu. Wie geht ihr an die Lösung dieser Aufgabe heran?

Gruß Marcia
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Verwende Threads mit einer Queue, das ist die sauberste Lösung.
Das Leben ist wie ein Tennisball.
marcia
User
Beiträge: 14
Registriert: Freitag 16. März 2012, 15:36

Danke EyDu! ;)

Ich habe nun einen Tread der Werte in eine Queue schreibt und einen Funktion die mittels after immer wieder gestartet wird und die Werte aus der Queue ausliest und in ein Message Widget schreibt.
Wenn der Thread fertig ist, kommen keine Werte mehr aus der Queue. Wie kann ich das darauf folgende einfrieren des Programms vermeiden. Gibt es eine Möglichkeit einen Timeout zu setzen? Sonst nutzt es mir ja nichts wenn ich einen Thread verwende.

Gruß Marcia
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Am einfachsten findet man so etwas raus, indem man einfach in die Dokumentation zur entsprechenden Methode schaut ;-)
Das Leben ist wie ein Tennisball.
BlackJack

@marcia: Sicherer als ein Timeout um das Ende der Daten zu erkennen wäre es das Ende durch ein Flag oder einen speziellen Wert in der Queue zu signalisieren und ein nicht-blockierendes `get()` zu benutzen. Denn ein Timeout kann ja auch bedeutet, dass der Aufruf über die `after()`-Funktion kam als der Thread noch nicht soweit war den nächsten Wert in die Queue zu schreiben.
marcia
User
Beiträge: 14
Registriert: Freitag 16. März 2012, 15:36

Hach das Leben kann soo schön sein, danke euch Beiden! :)

@EyDu, das kommt davon wenn man alles nur im Tiefflug überfliegt und die "wichtigsten" Stellen glatt überliest.

@BlackJack, ja du hast recht. Werde den Tipp umsetzen. Das grundsätzliche Problem ist die Asynchonität. "Einfach kann ja jeder!" ;-)

Gruß Marcia
Antworten