Tkinter自定义Button类实例化两次仅生效第二个的问题咨询
问题原因与解决办法
核心原因
你的Button类的__init__方法里包含了self.canv.delete("all")这行代码——它会清空画布上所有已存在的元素:
- 先创建
btn2时,画布上会生成btn2对应的红色矩形和图片按钮; - 紧接着创建
btn1时,这行代码会把btn2的所有元素全部删除,最终画布上只保留btn1的内容,看起来就像第一个实例被忽略了。
解决办法
直接删除__init__方法里的self.canv.delete("all")行,这样每个实例创建的元素都会保留在画布上。如果需要初始化画布,应该在创建所有实例之前统一执行一次canvas.delete("all"),而不是把清空逻辑写进每个实例的构造函数里。
修改后的__init__方法关键部分:
def __init__(self, x, y, canv,image,scale): self.drag = False self.image = image self.scale = scale self.TempScale = scale self.canv = canv # 移除清空画布的代码 # self.canv.delete("all") self.Used_Img = self.set_brightness(1) self.b,self.inc = 1,0.01 self.SpotX, self.SpotY = random.randint(0,200),random.randint(0,200) self.rect = canv.create_rectangle(self.SpotX,self.SpotY ,self.SpotX+100,self.SpotY+100,fill="red") self.button = canv.create_image(x, y, image=self.Used_Img) # 后续事件绑定代码保持不变
额外说明
如果你的需求是每次创建新实例时清空之前的内容,应该在创建新实例前手动调用canvas.delete("all"),类的构造函数只负责创建当前实例的元素,不该影响其他实例的内容。
内容的提问来源于stack exchange,提问作者MeHocha 333
相关产品推荐
相关产品推荐

