Tkinter游戏:删除实例

2024-06-01 09:32:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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)

我以为删除代码可以工作,但它给了我一个错误,它说: 1英寸,1英寸,2英寸=自我.bbox(bullet)TypeError:“NoneType”对象不可读取

我不知道这意味着什么,而且射击实际上不适用于这个。然而,在我删除子弹之前,它起作用了。我真的很感谢任何人的帮助。 谢谢


Tags: 代码imageself游戏tkinterdefx1动作
2条回答

没有看到你的代码自删除()方法和self是其实例的类声明的代码,很难判断到底是什么错误。在

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

尝试:

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

当您看到'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
    ...

可能发生的情况是,当一个项目符号第一次从屏幕上消失时,你可以很好地删除它,但是你忘了从项目列表中删除它。下次迭代项目符号列表时,列表中有一些项目已被删除。在

解决方法应该很简单:当你删除一个项目符号时,你会想把它从列表中删除。在

相关问题 更多 >