2017-05-24 2 views
0

Auf meiner Suche Python und tkinter zu lernen, habe ich manchmal ein Muster wie das gefunden, was ich gerade von einem Buch auf tkinter extrahiert:Was sind die Grenzen für rekursive tkinter Aufrufe?

def manage_periodic_updates_during_play(self): 
    self.update_clock() 
    self.update_seek_bar() 
    self.root.after(1000, self.manage_periodic_updates_during_play) 

Ich verstehe, dass dies ein Weg ist, um einige Schritte zu wiederholen in eine rekursive Methode, nach einer bestimmten Zeit, und ich habe sogar vor dieser Art von Muster in einem Projekt verwendet. Aber ich frage mich, ob es eine Grenze für die Häufigkeit gibt, mit der diese rekursiven Aufrufe durchgeführt werden können. Ich meine, wahrscheinlich hat Python eine Art Hinweis darauf, welche Funktion oder welche Methode genannt wird. Also, vielleicht in ein paar hundert oder ein paar tausend Zyklen konnten wir diese Grenze erreichen.

Gibt es solch eine Grenze, die wir in solchen Fällen berücksichtigen sollten? Wenn ja, was wäre eine gute Praxis? Wie können wir wissen, wie viele rekursive Aufrufe zulässig sind und wie verhindert werden kann, dass die App nicht mehr reagiert oder einen Fehler zurückgibt?

Antwort

2

Verwendung nach dieser Art und Weise nicht Rekursion ist. Sie schieben Jobs einfach in eine Warteschlange. Es gibt kein Limit, da Sie nur ein Element zur Warteschlange für jedes Element hinzufügen, das aus der Warteschlange gezogen wird. Angenommen, dies ist der einzige Ort, an dem Sie das tun, und Sie starten es nur einmal, wird die Warteschlange niemals größer als eins.

1

Es gibt keine Grenze dabei - es ist nicht ganz "rekursiv" - Sie nur ein einziges Ereignis, um die gleiche Funktion aufrufen, jedes Mal, wenn die Funktion ausgeführt wird.

Wenn die Funktion sich selbst direkt aufruft, ohne auf das Tkinter (ir other framework) -Ereignissystem zurückzugreifen, dann wären Sie auf das Standard-Rekursionslimit von cPython beschränkt, das 1000 Aufrufe enthält. Aber auf diese Weise, nachdem der Aufruf an root.after aufgelöst wird, endet Ihre Funktion tatsächlich, (und gibt eine implizite "None" zurück) - es ist die tkinter-Ereignisschleife, die den nächsten Aufruf an sie macht, nicht die Funktion selbst.

Verwandte Themen