递归tkinter调用有什么限制?

时间:2017-05-24 23:56:48

标签: python animation recursion tkinter scheduling

在我学习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正在保留一些关于哪个函数或方法称为wich的参考。所以,也许在几百或几千个周期中我们可以达到这个极限。

在这样的情况下,我们应该考虑这样的限制吗?如果是这样,那么什么是好的做法?我们怎么知道允许多少递归调用以及如何避免应用程序无响应或返回错误?

2 个答案:

答案 0 :(得分:2)

以这种方式使用不是递归。您只是将作业推送到队列中。没有限制,因为您只是为队列中的每个项目添加一个项目到队列中。假设这是你唯一这样做的地方,并且你只启动一次,那么队列永远不会超过一个。

答案 1 :(得分:1)

这样做是没有限制的 - 它并不完全"递归" - 每次函数运行时,你只需要创建一个单独的事件来调用相同的函数。

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