Tkinter游戏:删除实例

时间:2013-05-21 15:36:40

标签: python tkinter

我正在使用python和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'对象不可迭代”

我不确定这意味着什么,而拍摄实际上并不适用于此。但是,在我尝试删除子弹之前,它有效。我非常感谢任何人的帮助。 感谢

2 个答案:

答案 0 :(得分:2)

如果没有看到self.delete()方法的代码以及self是其实例的类声明的代码,很难说出确切的错误。

猜测一下,我会说你正在删除已经移出屏幕的子弹的实例对象,但是你没有从列表项目符号[]中删除它,所以下次你调用movebullet(self)时,它遍历self.bullets并在它试图移动时掉下来 现在不存在的子弹。

尝试:

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

答案 1 :(得分: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
    ...

可能发生的事情是,当子弹第一次离开屏幕时你正好删除它,但你忘记将它从子弹列表中删除。下次迭代项目符号列表时,列表中的某些项目已被删除。

修复应该很简单:删除子弹时,您需要将其从列表中删除。