在Tkinter Canvas中高效移动对象的方法

1 投票
1 回答
4084 浏览
提问于 2025-04-16 19:26

我需要一些帮助来完成一个作业,今天晚上我问了一个相关的问题,但我意识到我问得很糟糕,表达得也不清楚。这次我会尽量具体一点。

我有一段代码,它在一个游戏类里面(这个类是从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会帮助你避免程序悄悄出错。

撰写回答