Wie Sie Ihren eigenen code und Tkinter - Ereignisschleife?
Mein kleiner Bruder ist gerade erst in die Programmierung und für seine Wissenschaft Fair-Projekt, er ist eine simulation von einem Vogelschwarm in den Himmel. Er erhielt die meisten seiner code geschrieben und es funktioniert gut, aber die Vögel müssen sich zu bewegen jeden moment.
Tkinter, aber die Schweine die Zeit für seine eigene event-Schleife, und damit sein code wird nicht ausgeführt. Dabei root.mainloop()
läuft, läuft, und läuft, und das einzige was läuft ist der event-Handler.
Gibt es eine Möglichkeit zu haben, seinen code laufen neben dem mainloop (ohne multithreading, es ist verwirrend und das sollte einfach gehalten werden), und wenn ja, was ist es?
Jetzt kam er mit einem hässlichen hack, binden seine move()
Funktion <b1-motion>
, so dass so lange wie er hält die Taste gedrückt und wackelt die Maus, es funktioniert. Aber es muss einen besseren Weg geben.
InformationsquelleAutor Allan S | 2009-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie die
after
Methode auf dieTk
Objekt:Hier ist die Erklärung und die Dokumentation für die
after
Methode:Nach dem ziehen meine Haare für Stunden zu versuchen, um opencv und tkinter zusammen arbeiten ordnungsgemäß und sauber zu schließen, wenn Sie die [X] Schaltfläche geklickt wurde, wird diese zusammen mit win32gui.FindWindow(None, 'Fenster-Titel') hat den trick! Ich bin so ein noob 😉
Dies ist nicht die beste option, obwohl es funktioniert in diesem Fall, es ist nicht gut für die meisten Skripten (es läuft nur alle 2 Sekunden), und die Einstellung der timeout-Wert 0, die pro-Vorschlag-gepostet von @Nathan, da es nur ausgeführt wird, wenn tkinter nicht ausgelastet ist (was zu Problemen führen könnte, in komplexen Programmen). Am besten stick mit der
threading
Modul.InformationsquelleAutor Dave Ray
Den Lösung geschrieben von Björn Ergebnisse in einem "Absturz mit Laufzeitfehler: Aufruf von Tcl aus verschiedenen appartment" - Meldung auf meinem Rechner (RedHat Enterprise 5, python 2.6.1). Björn möglicherweise nicht haben bekommen diese Nachricht, weil laut ein Platz, den ich überprüft, falsche Handhabung threading mit Tkinter ist unberechenbar und Plattform-abhängig.
Das problem scheint zu sein, dass
app.start()
zählt wie eine Referenz in Tk, da die app enthält Tk-Elemente. Ich wurde dieser durch den Austauschapp.start()
mit einemself.start()
innen__init__
. Ich machte es auch so, dass alle Tk-Referenzen sind entweder in der Funktion, die Anrufemainloop()
oder innerhalb Funktionen, die aufgerufen werden die Funktion, dass Anrufemainloop()
(dies ist offenbar Kritischer zu vermeiden, die "andere Wohnung" - Fehler).Schließlich habe ich noch ein Protokoll-handler mit einem Rückruf, da ohne diese das Programm wird mit einem Fehler beendet, wenn die Tk-Fenster wird geschlossen, indem der Nutzer.
Den überarbeiteten code ist wie folgt:
run
Methode? Ich kann nicht scheinen, um herauszufinden, wie...in der Regel würden Sie Argumente an
__init__(..)
, speichern Sie Sie inself
und verwenden Sie Sie inrun(..)
InformationsquelleAutor Kevin
Beim schreiben Sie Ihre eigenen loop, wie in der simulation (ich nehme an), müssen Sie rufen Sie die
update
Funktion, die das tut, was diemainloop
: aktualisiert die Fenster mit Ihren änderungen, aber Sie tun es in Ihrer Schleife.task
genannt zu werden, Sie werden am Ende mit verschachtelten event-loops, und das ist schlecht. Es sei denn, Sie vollständig zu verstehen, wie event-loops arbeiten, sollten Sie vermeiden, fordernupdate
auf alle Kosten.Ich habe diese Technik einmal funktioniert OK, aber je nachdem, wie Sie es tun, haben Sie vielleicht ein paar taumelt in die Benutzeroberfläche.
InformationsquelleAutor jma
Eine weitere option ist lassen tkinter Ausführung in einem separaten thread. Ein Weg, es zu tun mögen dieses:
Aber vorsichtig sein, Multithread-Programmierung ist schwer und es ist wirklich einfach, um zu Schießen Sie sich selbst in den Fuß. Zum Beispiel müssen Sie vorsichtig sein beim ändern von member-Variablen der Beispiel-Klasse oben, so dass Sie nicht unterbrechen Sie mit der event-Schleife, die von Tkinter.
Nicht sicher, ob das funktionieren kann. Habe gerade versucht etwas ähnliches, und ich erhalte die Meldung "Absturz mit Laufzeitfehler: Haupt-thread ist nicht im main-loop".
jldupont: ich habe "Absturz mit Laufzeitfehler: Aufruf von Tcl aus verschiedenen appartment" (möglicherweise der gleiche Fehler in einer anderen version). Das Update war initialisieren Tk in run(), die nicht in der __init__(). Dies bedeutet, dass die Initialisierung der Tk in den gleichen thread wie Ihr Sie nennt, mainloop ().
InformationsquelleAutor
Dies ist die erste funktionierende version von dem, was ein GPS-reader und Daten-Moderatorin. tkinter ist eine sehr fragile Sache, die mit viel zu wenig Fehlermeldungen. Es tut nicht Sachen setzen und nicht sagen, warum viel von der Zeit. Sehr schwierig, aus einem guten WYSIWYG-Formular-Entwickler. Wie auch immer, dieser betreibt eine kleine routine 10-mal in einer Sekunde und präsentiert die Informationen auf einem Formular. Dauerte eine Weile, um es geschehen zu lassen. Als ich versuchte, einen timer den Wert 0, wird das Formular nie kam. Mein Kopf jetzt weh tut! 10 oder mehr mal pro Sekunde ist gut genug für mich. Ich hoffe, dass es jemandem hilft. Mike Morrow
InformationsquelleAutor Micheal Morrow