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

时间:2011-06-13 01:49:32

标签: python tkinter

我需要一些帮助才能完成作业,今天晚上我问了一个与之相关的问题,但我发现它的陈述和写得非常糟糕。我这次会尝试更具体一点。

我有以下代码,它位于Game类中(继承自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的说法,这种方法可以在画布上移动球。如果它为0,则向上移动,如果为1,则向下移动。

它可以正常工作几秒钟,但随后它会让游戏变得越来越慢,直到它完全停止。我也尝试过time.sleep,但它与Tkinter不兼容(你可能已经知道了)。

我认为问题在于使用root.after(),但我真的不知道任何其他方式无限期地移动对象。

1 个答案:

答案 0 :(得分: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]中,那么球将停止移动,并且不会显示原因。防守计划,特别是在开始时永远不要留下其他的,如果:

if name == "dhcarmona":
    pass
elif name == "msw":
    pass
else
    raise ValueError, "name is not as expected"

ValueError将使您的程序无声地破坏。