Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter canvas.after()方法如何不导致递归错误_Python_Recursion_Tkinter - Fatal编程技术网

Python tkinter canvas.after()方法如何不导致递归错误

Python tkinter canvas.after()方法如何不导致递归错误,python,recursion,tkinter,Python,Recursion,Tkinter,使用Tkinter canvas.after方法制作屏幕动画似乎比使用无休止的while True:loop更受欢迎。当我第一次看到canvas.after方法时,它看起来应该会导致一个最大递归深度超出错误,但事实并非如此。为什么呢?是因为它没有返回需要保存在内存中的值吗?它不会导致递归错误,因为它不是递归 Tkinter维护一个事件队列。mainloop负责遍历这个队列,按顺序处理每个事件。当您在之后调用时,不是递归地调用函数,而是向队列中添加一个新项 想象一下,例如,tkinter事件队列是

使用Tkinter canvas.after方法制作屏幕动画似乎比使用无休止的while True:loop更受欢迎。当我第一次看到canvas.after方法时,它看起来应该会导致一个最大递归深度超出错误,但事实并非如此。为什么呢?是因为它没有返回需要保存在内存中的值吗?

它不会导致递归错误,因为它不是递归

Tkinter维护一个事件队列。mainloop负责遍历这个队列,按顺序处理每个事件。当您在之后调用时,不是递归地调用函数,而是向队列中添加一个新项


想象一下,例如,tkinter事件队列是一个公开列表。例如,假设此队列名为Tkinter.event\u queue。当您执行canvas.after1000,my_函数时,它大致相当于执行Tkinter.event_queue.append1000,my_函数:。而且,正如您可能看到的,添加到列表中并不是递归。

您认为为什么会这样?它只是在后台发挥了一些魔力,以便主循环函数每隔一段时间就会调用您的函数。为什么要调用它自己呢?函数的结构似乎都是这样的:“def move:。。。调整坐标x,y的根。50后,移动“它看起来是递归的,至少乍一看是如此”。@PatrickDennis:它可能看起来像,但在。。。几乎是字面上的附加。。。。,