Von der effbot.org
-Dokumentation haben wir folgendes über die update
Funktion:
Verarbeitet alle ausstehenden Ereignisse, ruft Ereignisrückrufe auf, schließt alle aus Ausstehende Geometrieverwaltung, erstellt bei Bedarf neue Widgets und Aufrufe alle ausstehenden Leerlaufaufgaben. Diese Methode sollte mit Vorsicht verwendet werden, da es kann zu wirklich fiesen Race Conditions führen, wenn aus dem falschen gerufen wird (z. B. von einem Ereignisrückruf oder von einer Funktion) das kann in irgendeiner Weise von einem Ereignis-Rückruf aufgerufen werden, etc.). Wenn in Zweifeln Sie stattdessen
update_idletasks
.
Auf der anderen Seite gibt es das über die Funktion update_idletasks
:
Ruft alle ausstehenden Leerlaufaufgaben auf, ohne weitere Ereignisse zu verarbeiten. Dies kann verwendet werden, um Geometriemanagement- und Neuzeichnungs-Widgets auszuführen wenn nötig, ohne Callbacks aufzurufen.
Soweit ich es verstanden habe, rufen beide alle ausstehenden untätigen Aufgaben auf , schließen alle ausstehenden Geometriemanagement- und neu gezeichneten Widgets nach Bedarf ab . Der einzige Unterschied, den ich sehe, ist, dass update
alle ausstehenden Ereignisse verarbeitet und Ereignisrückrufe aufruft. Deshalb sollten wir nicht update
innerhalb eines geraden Callbacks aufrufen, nehme ich an.
Ich habe jedoch Beispiele gesehen, wo update_idletasks
und update
werden nacheinander verwendet, und ich kann den Grund nicht verstehen, da theoretisch update
alles update_idletasks
tut.
Was genau sind diese ausstehenden Ereignisse und die im Leerlauf befindlichen Aufgaben , über die in der Dokumentation gesprochen wird? Was sind die Unterschiede und Beziehungen?
Unter welchen Umständen sollte ich update
über update_idletasks
verwenden? Konkrete Beispiele werden ebenfalls geschätzt.
Der einzige Unterschied, den ich sehe, ist, dass das Update alle ausstehenden Ereignisse verarbeitet und ruft Ereignisrückrufe auf. Deshalb sollten wir kein Update von aufrufen in einem gleichmäßigen Rückruf, nehme ich an.
Sie haben auf beiden Konten Recht.
Was sind ausstehende Ereignisse? Ereignisse, die hauptsächlich mit after
geplant wurden. Und, wie Sie auch in Ihrer Frage erwähnt haben, Ereignisse, die ein Neuzeichnen auslösen.
Die Umstände, unter denen Sie update
über update_idletasks
verwenden sollten? Fast nie. Um ehrlich zu sein, lautet meine pragmatische Antwort: "Nennen Sie niemals update
, es sei denn, update_idletasks
macht nicht genug".
Wichtig ist, dass update
blockiert, bis alle Ereignisse verarbeitet werden. Das heißt, Sie haben ein mainloop
in einem mainloop
verschachtelt. Es ist nie eine gute Idee, eine Endlosschleife innerhalb einer Endlosschleife zu haben.
Wenn Sie Beispiele sehen, in denen einer nach dem anderen aufgerufen wird, sehen Sie sich schlechte Beispiele an. Ehrlich gesagt gibt es überhaupt keinen Grund, das zu tun. Viel Code, den ich sehe, ruft update
viel häufiger auf als je zuvor.
Tags und Links python python-3.x tkinter