我正在用python tkinter模塊使用畫布小部件編寫一個小遊戲。 有人,只是一個球,每10秒產生一次炸彈。 在炸彈產生3秒後,它開始「爆炸」過程,我在self.bomb對象上調用4個更多的方法來「爆炸」它的動畫。在調用.after()方法之後取消事件?
遊戲的目的是試圖「解除」炸彈。我想出了一些奇特的碰撞檢測工作。
self.canvas.delete(self.bomb)
然而,炸彈越來越大,變色(爆炸)仍然發生的下面的動畫,即使我已經「繳械」:一旦檢測到碰撞時,炸彈掉在畫布上的使用清除炸彈。這是因爲我原來的炸彈來電:
self.parent.after(3000, self.explode_first)
...我已經鏈接3個「爆炸」功能,所有綁定並與。經過()方法調用。
我試圖通過在.after()中調用的每個方法中插入條件來繞過這個問題,就像布爾值;
if self.bomb # if there's a bomb on the canvas,
self.parent.after(125, self.explode_second) # and explode third and so on
這是行不通的。我希望能夠「取消」使用after方法創建的tkinter隊列的事件,但這裏是踢球者。我不(無法)殺死所有的事件,只是在畫布上的事件。如果可能的話,我還有其他的事情要保持完整。
有沒有辦法做到這一點?如果沒有,歡迎提供有關如何在不事後取消的反饋和/或建議,並且提前致謝!
繼承人的相關代碼,以供參考:
和:
# continuously make and explode bombs
def create_bomb(self):
self.bomb = self.canvas.create_oval(self.b1,
self.b2,
self.b3,
self.b4,
fill = "red")
if self.bomb:
self.parent.after(3000, self.explode_first)
def explode_first(self):
if self.bomb:
self.b1 -= 5
self.b2 -= 5
self.b3 += 5
self.b4 += 5
self.canvas.delete(self.bomb)
self.bomb = self.canvas.create_oval(self.b1,
self.b2,
self.b3,
self.b4,
fill = "orange")
self.parent.after(125, self.explode_second)
def explode_second(self):
if self.bomb:
self.b1 -= 5
self.b2 -= 5
self.b3 += 5
self.b4 += 5
self.canvas.delete(self.bomb)
self.bomb = self.canvas.create_oval(self.b1,
self.b2,
self.b3,
self.b4,
fill = "yellow")
self.parent.after(125, self.explode_third)
def explode_third(self):
self.b1 -= 5
self.b2 -= 5
self.b3 += 5
self.b4 += 5
self.canvas.delete(self.bomb)
self.bomb = self.canvas.create_oval(self.b1,
self.b2,
self.b3,
self.b4,
fill = "white")
self.parent.after(125, self.explode_fourth)
def explode_fourth(self):
self.canvas.delete(self.bomb)
def bomb_disarmed(self):
print "disarmed the bomb!"
self.canvas.delete(self.bomb)
更新:所以,我用canvas.find_above(self.ball):作爲條件,這似乎工作。然而,通過tkinter帆布的文檔查看,這看起來很渺茫,如果我不解除炸彈的武裝,它現在永遠保持在那裏,就像之前它們會爆炸一樣。 – ford