我正在使用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'对象不可迭代”
我不确定这意味着什么,而拍摄实际上并不适用于此。但是,在我尝试删除子弹之前,它有效。我非常感谢任何人的帮助。 感谢
答案 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
...
可能发生的事情是,当子弹第一次离开屏幕时你正好删除它,但你忘记将它从子弹列表中删除。下次迭代项目符号列表时,列表中的某些项目已被删除。
修复应该很简单:删除子弹时,您需要将其从列表中删除。