Threaded Tkinter-Skript stürzt ab, wenn das zweite Toplevel-Widget erstellt wird

7

Ich habe ein Python-Skript, das Tkinter für die GUI verwendet. Mein kleines Skript sollte alle X Sekunden ein Toplevel-Widget erstellen. Wenn ich meinen Code ausführe, wird das erste Toplevel-Widget erfolgreich erstellt, aber wenn es versucht, ein zweites zu erstellen, stürzt das Programm ab.

Was ich mache, ist die Methode after, um die Funktion startCounting alle 5 Sekunden neben dem Rootloop der Wurzel aufzurufen. Jedes Mal, wenn diese Funktion aufgerufen wird, füge ich ein Toplevel-Widget-Objekt an eine Liste an und starte einen neuen Thread, der hoffentlich den neuen Mainloop ausführen wird.

Ich wäre sehr dankbar, wenn jemand dieses Problem herausfinden könnte. Übrigens ist das nur ein kleines Skript, das ich gerade benutze, um mein Problem zu lösen, das mich davon abhält, mit meinem wirklichen Schulprojekt fortzufahren.

Der Code:

%Vor%     
user430825 25.08.2010, 14:59
quelle

3 Antworten

22

Tkinter wird nur vom Hauptthread ausgeführt. Siehe Dokumente :

  

Führen Sie einfach den gesamten Benutzeroberflächencode aus   thread, und lassen Sie die Autoren auf eine schreiben   Warteschlangenobjekt; z.B.

... und es folgt ein wesentliches Beispiel, in dem sekundäre Threads beschrieben werden, die Anforderungen an eine Warteschlange schreiben und die Hauptschleife ausschließlich für alle direkten Interaktionen mit Tk verantwortlich ist.

Viele Objekte und Subsysteme mögen es nicht, Anfragen von mehreren verschiedenen Threads zu empfangen, und im Fall von GUI-Toolkits ist es nicht selten, dass sie spezifisch nur den main -Thread verwenden müssen.

Die richtige Python-Architektur für dieses Problem besteht immer darin, einen Thread (den wichtigsten, wenn es nötig ist) dem kniffligen Objekt oder Subsystem zu widmen; jeder andere Thread, der eine Interaktion mit dem Subsystem oder Objekt erfordert, muss sie durch Anfragen an den dedizierten Thread erhalten (und möglicherweise auf eine "Warteschlange" warten, um Ergebnisse zu erhalten, wenn aufgrund einer Anfrage Ergebnisse erforderlich sind). Dies ist auch eine sehr solide Python-Architektur für Allzweck-Threading (und ich erläutere es ausführlich in "Python in a Nutshell", aber das ist ein anderes Thema ;-).

    
Alex Martelli 25.08.2010 15:03
quelle
6

Tkinter hat Probleme mit Eingaben von mehreren Threads, ich benutze stattdessen mtTkinter, Sie müssen keinen Code ändern und alles wird gut funktionieren. Importieren Sie einfach mtTkinter statt Tkinter.

Sie können es hier bekommen:

Ссылка

    
Patrick T Nelson 18.03.2012 15:34
quelle
0

Gibt es einen Grund, warum Sie eine Ereignisschleife pro Toplevel-Fenster benötigen (oder denken, dass Sie das brauchen)? Eine einzelne Ereignisschleife kann Dutzende (wenn nicht Hunderte oder Tausende) von Toplevel-Fenstern verarbeiten. Und wie in einer anderen Antwort darauf hingewiesen wurde, können Sie diese Ereignisschleife nicht in einem separaten Thread ausführen.

Um Ihren Code zu reparieren, müssen Sie also nur eine einzige Ereignisschleife verwenden und diese im Hauptthread ausführen.

    
Bryan Oakley 25.08.2010 15:20
quelle

Tags und Links