Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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 获得;超过最大递归深度;错误,我应该重新构造代码吗?_Python_Animation_Recursion_Tkinter - Fatal编程技术网

Python 获得;超过最大递归深度;错误,我应该重新构造代码吗?

Python 获得;超过最大递归深度;错误,我应该重新构造代码吗?,python,animation,recursion,tkinter,Python,Animation,Recursion,Tkinter,我正在创建一个围绕中心点旋转几个点的应用程序。目的是使用直线/圆弧连接每个点,并使点/(后续图形)围绕中心点旋转 我试图通过一种方法来实现这一点,每次调用该方法时,将每个点旋转给定的量,然后使用for循环围绕中心点分布每个点n次 (为了将来的使用,我还需要一些tkinter小部件沿着代码运行,例如获取用户输入的条目。) 我当前的代码只是为每个点画一个圆,而不是将它们连接起来。有几件事我目前还不明白: 我的代码在短时间内运行正常,然后关闭,出现错误:超过了最大递归深度。-通过清除画布是否不好。删除

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

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

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

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

  • 我的代码在短时间内运行正常,然后关闭,出现
    错误:超过了最大递归深度。
    -通过
    清除画布是否不好。删除

  • .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))
    

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

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

    您没有为工作示例解决方案提供足够的代码,但我相信问题在于您使用错误的参数调用了
    .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()
    的第二个参数不正确造成的,例如,由于编程错误导致错误的递归。

    您没有为工作示例解决方案提供足够的代码,但我认为问题在于您使用错误的参数调用了
    .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()
    的第二个参数不正确造成的,即,由于编程错误而导致的错误递归。

    通常,您可能不应该在Python中使用递归函数,因为您遇到了确切的情况。看,我根本不会这么说——当您需要递归时,例如遍历递归数据结构时,递归没有什么错。但是上面的代码在每种语言中都会失败——Python与之无关。问题的原因是这样的语句:
    self.location.after(100000000,self.draw\u rotating\u gear(480,200,500,300,5))
    。将其更改为
    self.location。之后(100000000,self.draw\u旋转齿轮,480、200、500、300、5)
    将修复它。然而,每次使用固定参数调用函数似乎都是一个设计问题,为什么延迟时间
    100000000
    如此之大。一般来说,您可能不应该在Python中使用递归函数,因为您遇到了确切的情况。看,我根本不会这么说——当您需要递归时,例如遍历递归数据结构时,递归没有什么错。但是上面的代码在每种语言中都会失败——Python与之无关。问题的原因是这样的语句:
    self.location.after(100000000,self.draw\u rotating\u gear(480,200,500,300,5))
    。将其更改为
    self.location。之后(100000000,self.draw\u旋转齿轮,480、200、500、300、5)
    将修复它。然而,每次调用带有固定参数的函数似乎都是一个设计问题,为什么延迟时间
    100000000
    如此之大。