递归 tkinter 调用的限制是什么?

What are the limits on recursive tkinter calls?

在我学习 Python 和 tkinter 的过程中,我有时会发现这样的模式,我刚刚从一本关于 tkinter 的书中摘录:

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

我理解这是一种在指定时间后递归重复某些步骤的方法,我什至在项目中使用过这种模式。但是我想知道这个递归调用的次数是否有限制。我的意思是,可能 Python 保留了某种关于调用哪个函数或方法的参考。所以,也许在几百或几千个周期内我们就可以达到这个极限。

在这种情况下我们应该考虑这样的限制吗?如果是这样,什么会被认为是好的做法?我们如何才能知道将允许多少次递归调用以及如何避免应用变得无响应或返回一些错误?

这样做是没有限制的- 它不完全是 "recursive" - 每次函数运行时,您只需创建一个事件来调用同一个函数。

如果函数实际上直接调用自身,而不使用 Tkinter(ir 其他框架)事件系统进行调度 - 那么您将被限制为 cPython 的默认递归限制,即 1000 次调用。 但是通过这种方式,在对 root.after 的调用解析之后,yoru functina 实际上结束了,(并且 return 是一个隐式的 "None")——tkinter 事件循环将进行下一次调用它,而不是函数本身。

这种方式之后使用不是递归。您只是将作业推送到队列中。没有限制,因为对于从队列中拉出的每个项目,您只需将一个项目添加到队列中。假设这是您唯一执行此操作的地方,并且您只启动一次,队列永远不会超过一个。