我的目标是实例化一个名为箭头的类,所以我可以有更多箭头然后只有1.我想从坐标200,200开始,并希望每100毫秒增加15个。但是当我尝试执行此代码时,它会给我以下错误:
File "game.py", line 25, in moveArrow
self.after(100, self.moveArrow(arrow, xCoord+15, yCoord)) #repeat, changing x
File "game.py", line 24, in moveArrow
arrow.place(x = xCoord, y = yCoord) #replace with new x,y
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1860, in place_configure
+ self._options(cnf, kw))
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1055, in _options
elif isinstance(v, (tuple, list)):
RuntimeError: maximum recursion depth exceeded while calling a Python object
"文件" game.py",第25行,在移动箭头self.after(100,self.moveArrow(箭头,xCoord + 15,yCoord))#repeat,更改x& #34;也经常重复。
from Tkinter import *
from random import randint
from PIL import ImageTk, Image
class App(Frame):
def __init__(self, master=None):
Frame.__init__(self, master, height=400, width=400)
self.master = master
self.master.bind('<Shift_L>', self.createArrow)
def createArrow(self, event):
self.arrow = Arrow(self)
self.arrow.moveArrow(self.arrow, 200, 200)
class Arrow(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.arrowImage = ImageTk.PhotoImage(Image.open("arrow.gif"))
Label(self, image=self.arrowImage).pack()
def moveArrow(self, arrow, xCoord, yCoord):
arrow.place_forget()
arrow.place(x = xCoord, y = yCoord)
self.after(100, self.moveArrow(arrow, xCoord+15, yCoord))
root = Tk()
root.title("Mein erstes Spiel")
app = App(master=root).pack()
root.mainloop()
答案 0 :(得分:7)
其他答案对于这一行的问题来源是正确的:
self.after(100, self.moveArrow(arrow, xCoord+15, yCoord))
但答案是特定于Tkinter:
查看after
方法的文档,了解如何正确实现此方法。将其称为普通函数调用就可以实现这一点,并在控制流到达该函数调用时将程序抛入无限循环。使用after
时,您有两种选择:
传递时间arg,然后是回调,然后是回调args:
self.after(100, self.moveArrow, arrow, xCoord+15, yCoord)
或者,使用lambda表达式来保存函数调用:
self.after(100, lambda: self.moveArrow(arrow, xCoord+15, yCoord))
答案 1 :(得分:1)
您正在self.moveArrow(arrow, xCoord+15, yCoord)
方法中调用moveArrow()
。
所以你在任何阶段都没有break
无限递归。
如果你想了解如何构建python递归方法,你可以阅读here
如果你想创建一些简单的移动效果,那么只需在循环中进行操作就可以说你在x + 200处移动箭头而y + 200生成一个简单的for循环并且延迟移动箭头。 / p>
伪代码示例:
def moveArrow(....)
loop:
x += 10
y += 10
change_arrow_place(...)
答案 2 :(得分:0)
产生问题的行是
self.after(100, self.moveArrow(arrow, xCoord+15, yCoord))x
因为moveArrow
没有中断条件。当我们在编程语言中使用递归时,递归需要break
条件,它不会调用更多相同的函数。
例如:递归中的素数
int isPrime(int num,int i){
if(i==1){
return 1;
}else{
if(num%i==0)
return 0;
else
isPrime(num,i-1);
}
}
上面的代码中断条件是if (i==1)
和if(num%i==0)
在这两个条件下它不会调用isPrime
函数,递归将在那里终止。
请添加休息条件并重新运行。