“超过最大递归深度”错误,我应该重新构造代码吗?

2024-09-30 18:31:04 发布

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

我正在创建一个围绕一个中心点旋转几个点的应用程序。其目的是使用直线/圆弧连接每个点,并使点/(后续绘图)围绕中心点旋转。你知道吗

我试图通过一种方法来实现这一点:每次调用该方法时,将每个点旋转给定的量,然后使用for循环围绕中心点分布每个点n次。你知道吗

(为了将来的使用,我还需要一些tkinter小部件在代码旁边运行,例如获取用户输入的条目。)

我当前的代码只是为每个点画一个圆,而不是连接它们。有几件事我现在还不明白:

  1. 我的代码运行了很短一段时间,然后以Error: maximum recursion depth exceeded.结束—用.delete清除画布是否不好?

  2. .after函数的值似乎没有任何影响,因此使用time.sleep

(我还使用了while True:循环来运行早期版本中的代码,但我了解到在GUI事件循环中运行无限循环是一种不好的做法。我编辑它是因为闪烁)

以不同的方式构造代码会更好吗? 对不起,我的术语有误,邮件/代码又乱又长,我是一个非英语python的新学生。你知道吗

class Create_gear:

    def __init__(self, location, ox, oy, rpm, n):
        self.location = location
        self.ox = ox
        self.oy = oy
        self.rpm = rpm
        self.n = n
        self.rotation_from_normal = 0

    #Rotates point px1, py1 by value of "rpm" each time method is called.
    def draw_rotating_gear(self, px1, py1, px2, py2, r):
        self.rotation_from_normal = self.rotation_from_normal +self.rpm
        self.location.delete("all")

        #rotates point px1, py1 n times around to form a circle. 
        for i in range (0, self.n):
            angle = (math.radians(self.rotation_from_normal + 360/self.n *i) )

            qx = ( self.ox + math.cos(angle) * (px1 - self.ox) - math.sin(angle) * (py1 - self.oy) )
            qy = ( self.oy + math.sin(angle) * (px1 - self.ox) + math.cos(angle) * (py1 - self.oy) )

            x0 = qx - r
            y0 = qy - r
            x1 = qx + r
            y1 = qy + r
            self.location.create_oval(x0, y0, x1, y1, fill = "black")
        self.location.update()
        time.sleep(0.01)
        self.location.after(1000000000, self.draw_rotating_gear(480, 200, 500, 300, 5))

Tags: 代码fromselftimelocationmathoxrpm
2条回答

您没有为一个有效的示例解决方案提供足够的代码,但我相信问题是您用错误的参数调用了.after()方法。第一个参数必须是整数,即调用前的毫秒数,而不是浮点值。第二个参数需要是一个函数,在延迟之后调用,而不是调用一个函数。解决这些问题,并稍微简化您的示例,我希望得到如下结果:

def draw_rotating_gear(self, px1, py1, r):
    self.rotation_from_normal = self.rotation_from_normal + self.rpm
    self.location.delete("all")

    # rotates point px1, py1 n times around to form a circle.
    for i in range(0, self.n):
        angle = (math.radians(self.rotation_from_normal + 360/self.n * i))

        qx = (self.ox + math.cos(angle) * (px1 - self.ox) - math.sin(angle) * (py1 - self.oy))
        qy = (self.oy + math.sin(angle) * (px1 - self.ox) + math.cos(angle) * (py1 - self.oy))

        x0 = qx - r
        y0 = qy - r
        x1 = qx + r
        y1 = qy + r
        self.location.create_oval(x0, y0, x1, y1, fill="black")

    self.location.update()
    self.location.after(100, lambda px1=qx, py1=qy, r=r: self.draw_rotating_gear(px1, py1, r))

(由于没有足够的代码上下文来处理,我可能向lambda调用传递了错误的变量。)您得到的递归错误是由于.after()的第二个参数不正确造成的,即由于编程错误而导致的错误递归。你知道吗

对问题的描述中没有任何东西表明需要递归,而在代码中实现递归的方式总是失败的。在函数draw\u rotating\u gear()的末尾调用draw\u rotating\u gear(),但没有停止递归的条件,因此在第一次调用时它将无限深入。重新组织它以使用一个简单的循环。你知道吗

相关问题 更多 >