macOS上带有tkinter移动对象的递归错误

2024-05-29 03:07:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习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或更大,则一切正常。为什么呢


Tags: the代码tkinterwindows地方错误时间macos
1条回答
网友
1楼 · 发布于 2024-05-29 03:07:06

问题在于这行代码:

canvas.update()

您绝对不应该在从事件处理程序调用的函数中调用update(通过after运行函数被视为事件处理程序)。完全没有必要让您的程序工作,需要删除它

所发生的情况是,您对after的调用在给定的时间量之后添加了一些要由mainloop完成的工作。当您调用update时,如果给定的时间已经过去,它将执行该工作,否则它可能什么都不做

如果您的计算机速度足够慢,那么当您调用update时,将是进入下一帧动画的时间。这会导致在第一次调用返回之前通过canvas.update()再次调用moveCora。这就是为什么会出现递归错误

我无法在16毫秒时在我的机器上复制这个问题,但当我将时间移到5毫秒时,我能够重现它。您必须有一台移动线路需要16毫秒以上的机器,然后调用after。当我删除对canvas.update()的调用时,我能够将该值设置为1ms而没有问题

相关问题 更多 >

    热门问题