我正在创建一个围绕中心点旋转几个点的应用程序。目的是使用例如来连接每个点。线/弧,并使点/(后续图形)绕中心点旋转。
我正在尝试通过一种方法来实现这一点,该方法每次调用该方法时都将每个点旋转给定的数量,然后使用n
循环将每个点围绕中心点分布for
次。
(为将来使用,我还将需要一些tkinter小部件,它们与代码一起运行,例如,条目以获取用户输入。)
我当前的代码只是为每个点画一个圆,而不是将它们连接起来。我目前不了解以下几点:
我的代码可以运行一会儿,然后用Error: maximum recursion depth exceeded.
关闭-用.delete
清除画布是否不好?
.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))
答案 0 :(得分:1)
问题描述中没有任何内容表明完全需要递归,并且在代码中实现它的方式将始终失败。您可以在函数draw_rotating_gear()的末尾调用draw_rotating_gear(),而没有任何条件可以停止递归,因此在第一次调用时它将无限扩展。重新组织它以使用简单的循环。
答案 1 :(得分:1)
您没有为有效的示例解决方案提供足够的代码,但我认为问题在于您正在使用错误的参数来调用.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
调用。)您遇到的递归错误是由于{{1} },即由于编程错误导致的虚假递归。