2013-05-21 126 views
0

我正在使用python和tkinter進行比賽。到目前爲止,它有很好的發展,就像我有運動,射擊......很好的拍攝。我能夠創造子彈並將其移向我想要的方向。但是,我想在他們離開屏幕時將其刪除。這是我遇到麻煩的部分。下面是我拍攝的代碼(這勢必鼠標左鍵)和我的移動代碼:Tkinter遊戲:刪除實例

def shoot(self,e): 
    theplayer=self.find_withtag("player") 

    bullet=self.create_image([self.coords(theplayer)],image=self.playerUp,tag="bullet") 
    self.bullets.append(bullet) 

def movebullet(self): 
    for bullet in self.bullets: 
     x1,x2,y1,y2=self.bbox(bullet) 

     if x1>1200: 
      self.move(bullet,14,0) 
     else: 
      self.delete(bullet) 

我以爲刪除代碼的工作,但它給了我一個錯誤,指出: 「X1,X2, y1,y2 = self.bbox(bullet)TypeError:'NoneType'對象不可迭代「

我不確定這是什麼意思,並且拍攝實際上不適用於此。不過,它在我嘗試刪除子彈之前就起作用了。我真的很感激任何人的幫助。 謝謝

+0

您確定要x1> 1200而不是x1 <1200嗎?我想你會希望子彈在仍然在屏幕上時移動。現在看起來你一旦被觸發就會刪除每一顆子彈。 – ecline6

+0

woops good catch。現在他們實際上移動了,但是當他們達到1200時,我得到和以前一樣的錯誤 –

+0

我認爲jwygralak的答案在下面是對於NoneType – ecline6

回答

2

沒有看到self.delete()方法的代碼和self是實例的類聲明的代碼,很難說出什麼是確切的錯誤。

在猜測,我會說你刪除了已經移出屏幕外的子彈的實例對象,但是你並沒有從列表中刪除它,所以下次你調用movebullet(self)時, ,它會遍歷self.bullets並在嘗試移動現在不存在的子彈時掉下來。

嘗試:

else: 
    self.bullets.remove(bullet) 
    self.delete(bullet) 
+0

經過進一步的考慮,看起來self是Tkinter.Canvas小部件的一個實例,每個子彈都是該畫布上的圖像。您在子彈圖像上調用delete(),將其從畫布中移除,但仍然存在於項目符號列表中。 – jwygralak67

+0

它的工作原理!感謝所有貢獻的人;這是一個真正的救星,看到我只有幾天的時間來完成這個遊戲! –

+0

'接受'或'upvote'將不勝感激 – jwygralak67

1

當你看到'NoneType' object is not iterable,這意味着您要遍歷的東西,有值None:你不能在單個值None迭代。

在語句x1,x2,y1,y2=self.bbox(bullet)中,您正在迭代self.bbox(bullet)的結果,並且在某些情況下該函數顯然返回None。您需要獲取該函數的值,並在對返回的內容進行任何操作之前檢查它是否爲not None,例如將其分解爲單獨的變量。

例如,您可能要更改您的代碼:

bbox = self.bbox(bullet) 
if bbox is not None: 
    x1,y1,x2,y2 = bbox 
    ... 

可能發生的情況是,第一次子彈熄滅屏幕你刪除它就好了,但你忘了將其從子彈列表中刪除。下一次迭代項目符號列表時,列表中的某些項目已被刪除。

該修復應該很簡單:當您刪除一個項目符號時,您需要將它從列表中刪除。

+0

老實說,我不知道如何去做這:)我試着添加「不(x1,x2,y1,y2 == self.bbox(bullet))」到「if x1 <1200」語句,並且給了我相同的'NoneType'錯誤。 –

+0

好的,這很有意義。我會嘗試一下 –