在Tkinter Canvas中高效移动对象的方法
我需要一些帮助来完成一个作业,今天晚上我问了一个相关的问题,但我意识到我问得很糟糕,表达得也不清楚。这次我会尽量具体一点。
我有一段代码,它在一个游戏类里面(这个类是从Canvas类继承来的):
def move_ball(self):
if self.balldir==0:
self.move(self.ball,0,-10)
elif self.balldir==1:
self.move(self.ball,0,10)
root.after(20,self.move_ball)
这个方法是用来在画布上移动一个球的,移动的方向由self.balldir决定。如果self.balldir是0,球就向上移动;如果是1,球就向下移动。
一开始这个方法运行得很好,但过了一会儿,游戏就越来越慢,直到完全停止。我也试过用time.sleep,但这在Tkinter里效果不好(你可能已经知道了)。
我觉得问题出在使用root.after()
上,但我真的不知道还有什么其他方法可以让一个物体无限期地移动。
1 个回答
0
二十毫秒听起来像是一个很短的时间,这可能会影响到一些我不知道的平台依赖。你的代码片段中也不清楚balldir
可能被赋予什么值。如果你希望balldir
只会是0或1,那么你可能会觉得下面的内容有帮助:
def move_ball(self):
assert 0 <= self.balldir <= 1
self.move(self.ball, 0, 10 * (-1 * self.balldir))
root.after(...
在你的代码片段中,如果balldir
的值不是0或1,球就会停止移动,而且你不会知道为什么会这样。为了编程时更加安全,特别是刚开始学习的时候,尽量不要写没有else的if语句:
if name == "dhcarmona":
pass
elif name == "msw":
pass
else
raise ValueError, "name is not as expected"
这样的话,ValueError会帮助你避免程序悄悄出错。