删除和删除附加对象-python
有了下面的代码,我可以在点击的时候从列表中删除附加的精灵,但遗憾的是,这不是我需要的。我花了几个小时的时间试图让它在移动类中循环15次后自动删除并从列表中删除。(如果你需要的话,我可以提供给你删除和删除附加对象-python,python,tkinter,append,Python,Tkinter,Append,有了下面的代码,我可以在点击的时候从列表中删除附加的精灵,但遗憾的是,这不是我需要的。我花了几个小时的时间试图让它在移动类中循环15次后自动删除并从列表中删除。(如果你需要的话,我可以提供给你 class projectilesGroup(object): def __init__(self, canvas): self.canvas = canvas self.projectiles = list() self.moving = Tru
class projectilesGroup(object):
def __init__(self, canvas):
self.canvas = canvas
self.projectiles = list()
self.moving = True
def clicked(self, event, projectile):
print('clicked:', projectile),
# remove oval from canvas
self.canvas.delete(projectile.oval)
# remove enemy from list
self.projectiles.remove(projectile)
def add_new_projectile(self):
print(len(self.projectiles))
if len(self.projectiles) < 5:
e = projectile(self.canvas)
# stop new enemy if all enemies are stoped
e.moving = self.moving
self.canvas.tag_bind(e.oval, '<Button-1>', lambda event:self.clicked(event, e))
self.projectiles.append(e)
else:
print("You have 5 spells active - I can't add more.")
类ProjectleGroup(对象):
定义初始化(自我,画布):
self.canvas=画布
self.projectles=list()
self.moving=True
已单击def(自身、事件、投射物):
打印('单击:',投射物),
#从画布上移除椭圆
self.canvas.delete(sparket.oval)
#把敌人从名单上除名
自我。射弹。移除(射弹)
def添加新投射物(自身):
打印(透镜(自投射物))
如果len(自射弹)<5:
e=投射物(自我画布)
#如果所有敌人都被阻止,则阻止新敌人
e、 移动的
self.canvas.tag_bind(e.oval',lambda事件:self.clicked(事件,e))
self.projectles.append(e)
其他:
打印(“你激活了5个法术-我不能再添加了。”)
谢谢
def move(self):
if repcount < 15:
if self.moving: # to stop root.after
if self.direction == 1: # up
self.y1 -= self.radius
self.y2 -= self.radius
elif self.direction == 2: # down
self.y1 += self.radius
self.y2 += self.radius
elif self.direction == 3: # left
self.x1 -= self.radius
self.x2 -= self.radius
elif self.direction == 4: # right
self.x1 += self.radius
self.x2 += self.radius
self.canvas.coords(self.oval, self.x1, self.y1, self.x2, self.y2)
repcount += 1
root.after(20, self.move)
else:
print('done')
def移动(自):
如果重复计数小于15:
如果self.moving:#停止root.after
如果self.direction==1:#向上
self.y1-=自半径
self.y2-=自半径
elif self.direction==2:#向下
self.y1+=自半径
self.y2+=自半径
elif self.direction==3:#左
self.x1-=自半径
self.x2-=自半径
elif self.direction==4:#正确
self.x1+=自半径
self.x2+=自半径
self.canvas.coords(self.oval、self.x1、self.y1、self.x2、self.y2)
重复计数+=1
root.after(20,self.move)
其他:
打印(‘完成’)
首先,每个对象都需要变量来计算移动次数。当计数器
计数到15时,对象可以自行移除
对象可以轻松地从画布中删除椭圆,因为它具有self.oval
和self.canvas
小问题可能是从projectlist
中删除对象,但您可以访问projectlist
:
e = projectile(self.canvas, self.projectiles)
编辑:可以这样做
class ProjectilesGroup(object):
# ...
def clicked(self, event, projectile):
print('clicked:', projectile),
self.remove(projectile)
def remove(self, projectile):
# remove oval from canvas
self.canvas.delete(projectile.oval)
# remove enemy from list
self.projectiles.remove(projectile)
def add_new_projectile(self):
print(len(self.projectiles))
if len(self.projectiles) < 5:
e = Projectile(self, self.canvas) #parent and canvas
# ...
class Projectile():
def __init__(self, parent, canvas):
self.parent = parent
self.canvas = canvas
# ...
def move(self):
# ....
else:
print('done')
self.parent.remove(self)
类ProjectleGroup(对象):
# ...
已单击def(自身、事件、投射物):
打印('单击:',投射物),
自行移除(投射物)
def移除(自身、投射物):
#从画布上移除椭圆
self.canvas.delete(sparket.oval)
#把敌人从名单上除名
自我。射弹。移除(射弹)
def添加新投射物(自身):
打印(透镜(自投射物))
如果len(自射弹)<5:
e=投射物(自我,自我画布)#父对象和画布
# ...
类():
定义初始化(自、父、画布):
self.parent=parent
self.canvas=画布
# ...
def移动(自我):
# ....
其他:
打印(‘完成’)
self.parent.remove(self)
顺便说一句:在文档
PEP8
中,有人建议使用“CamelCase”类名称,如Sprojects和ProjectleGroup。在代码中识别类更容易。一些编辑器甚至对CamelCase名称使用不同的颜色(所以使用蓝色)是的,我在运动类周围有一个计数器