You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:59:59