Was ist der Unterschied zwischen "update" und "update_idletasks"?

8

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.

    
nbro 20.03.2015, 03:18
quelle

1 Antwort

11
  

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.

    
Bryan Oakley 20.03.2015, 03:56
quelle

Tags und Links