2017-05-24 5 views
0

Sur ma quête pour apprendre Python et tkinter, j'ai trouvé parfois un modèle comme celui-ci, que je viens extraite d'un livre sur tkinter:Quelles sont les limites des appels tkinter récursifs?

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

Je comprends que cela est un moyen de répéter certaines étapes une manière récursive, après un temps spécifié, et j'ai même utilisé avant ce genre de modèle dans un projet. Mais je me demande s'il y a une limite au nombre de fois que ces appels récursifs peuvent être faits. Je veux dire, probablement que Python garde une sorte de référence sur la fonction ou la méthode appelée wich. Donc, peut-être dans quelques centaines ou quelques milliers de cycles, nous pourrions atteindre cette limite.

Y a-t-il une telle limite que nous devrions prendre en considération dans des cas comme celui-ci? Si oui, qu'est-ce qui serait considéré comme une bonne pratique? Comment pouvons-nous savoir combien d'appels récursifs seront autorisés et comment éviter que l'application ne réponde ou ne renvoie une erreur?

Répondre

2

L'utilisation de cette manière n'est pas récursive. Vous êtes simplement en train de pousser les travaux sur une file d'attente. Il n'y a pas de limite car vous ajoutez un seul élément à la file d'attente pour chaque élément retiré de la file d'attente. En supposant que c'est le seul endroit où vous faites cela, et vous ne le lancez qu'une fois, la file d'attente ne grossit jamais plus d'un.

1

Il n'y a aucune limite à le faire de la sorte - ce n'est pas tout à fait "récursif" - vous crêtez un seul événement pour appeler la même fonction, chaque fois que la fonction s'exécute. Si la fonction s'appelle directement directement, sans recourir à la planification en utilisant le système d'événements Tkinter (ir other framework), alors vous serez limité à la limite de récursivité par défaut de cPython qui est de 1000 appels. Mais de cette façon, après que l'appel à root.after se résout, vous finissez functina ctually, (et renvoyez un "None" implicite) - c'est la boucle d'événement tkinter qui fera l'appel suivant, pas la fonction elle-même.