我正在学习tkinter,这涉及形状的流体运动。这就是我现在被困的地方
我得到了不一致的递归错误。该代码在Windows 1O上运行没有问题,但在我的macOS上它崩溃了
此外,如果递归之间的时间是≥ 17毫秒,它只是停止出错并按预期运行。我简化了代码,只是为了包含一个问题
from tkinter import *
master = Tk()
canvas = Canvas(bg = "gray", width = 1000, height = 800)
canvas.pack()
cara = canvas.create_line(100,100,900,100, width = 5, fill = "red")
def moveCara():
canvas.move(cara, 0,1)
canvas.after(16, moveCara) # Here is the time setting, change it to 17 and the thing
# does not crash.
canvas.update()
moveCara()
mainloop()
此代码导致我的MacBook崩溃:
RecursionError: maximum recursion depth exceeded during compilation
但是,如果我将canvas.after()
中的时间更改为17或更大,则一切正常。为什么呢
问题在于这行代码:
您绝对不应该在从事件处理程序调用的函数中调用
update
(通过after
运行函数被视为事件处理程序)。完全没有必要让您的程序工作,需要删除它所发生的情况是,您对
after
的调用在给定的时间量之后添加了一些要由mainloop
完成的工作。当您调用update
时,如果给定的时间已经过去,它将执行该工作,否则它可能什么都不做如果您的计算机速度足够慢,那么当您调用
update
时,将是进入下一帧动画的时间。这会导致在第一次调用返回之前通过canvas.update()
再次调用moveCora
。这就是为什么会出现递归错误我无法在16毫秒时在我的机器上复制这个问题,但当我将时间移到5毫秒时,我能够重现它。您必须有一台移动线路需要16毫秒以上的机器,然后调用
after
。当我删除对canvas.update()
的调用时,我能够将该值设置为1ms而没有问题相关问题 更多 >
编程相关推荐