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
GUI stoppt wenn main.after zuviel Zeit benötigt
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

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
Am einfachsten findet man so etwas raus, indem man einfach in die Dokumentation zur entsprechenden Methode schaut 

Das Leben ist wie ein Tennisball.
@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.
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

@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