2011-06-13 70 views
1

我需要一些幫助來完成作業,今天晚上我問了一個與它有關的問題,但是我認識到它的描述和編寫都很差。我會嘗試這次更具體一些。在Tkinter畫布中移動對象的有效方法

我有下面的代碼段,這是一個遊戲類(從畫布類繼承)的內部:

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) 

此方法supossed移動一個球在畫布上,根據self.balldir 。如果它是0,則向上移動,如果是1,則向下移動。

它可以在幾秒鐘內正常工作,但它只是讓遊戲變得越來越慢,直到它完全停止。我也嘗試過使用time.sleep,但它不適用於Tkinter(正如你可能已經知道的那樣)。

我認爲問題在於使用root.after(),但我真的不知道任何其他方式來移動一個對象無限期的時間。

+0

可能重複的[代碼在TKinter中的python GUI中的計時器](http://stackoverflow.com/questions/2400262/code-a-timer-in-a-python-gui-in-tkinter) – msw 2011-06-13 01:52:56

+0

I想要收回我的近距離投票,但不能。哎呀。 – msw 2011-06-13 02:11:31

+1

這個代碼本身不會讓你的程序變得越來越慢。我發佈了一個答案,解釋了爲什麼你的程序變慢。您在這裏發佈的代碼很好,並且或多或少都可以,假設'self.move'正確調整球對象的座標。 – 2011-06-13 14:57:05

回答

0

20毫秒看起來像是一個短暫的時間表,這可能會調整一些我不知道的平臺依賴項。從代碼片段中可以分配哪些值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 name == "dhcarmona": 
    pass 
elif name == "msw": 
    pass 
else 
    raise ValueError, "name is not as expected" 

凡ValueError錯誤讓你的程序從默默打破。