2013-05-21 83 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

好的,这很有意义。我会尝试一下 –