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

变量无操作自动变更问题及记忆游戏Button类代码技术咨询

问题根源与修复方案

我一眼就发现了导致你“变量自动变更”的核心问题——你在Button类的__init__方法里误用了bind_all!

问题分析

每次创建一个Button实例时,代码里的self.canvas.bind_all("<Button-1>", self.action)都会给整个Tkinter窗口的左键点击事件绑定一次当前实例的action方法。这意味着:

  • 当你点击窗口任意位置时,所有已创建的Button实例的action方法都会被触发
  • 多个实例的self.open变量会被同时修改,看起来就像是“没操作却自动变更”

修复步骤

你需要给每个按钮对应的矩形元素单独绑定点击事件,而不是给整个窗口绑定。具体修改如下:

  1. 替换绑定方式:把bind_all改成tag_bind,只给当前按钮的矩形绑定点击事件
  2. 调整action方法:Tkinter的事件回调需要接受event参数

修改后的完整代码片段:

from tkinter import Tk, Canvas  # 补充必要的模块导入

tk = Tk()
tk.title('Memory Game')
tk.wm_attributes('-topmost', 1)
tk.resizable(0, 0)
canvas = Canvas(tk, width=400, height=600, bg='white', bd=0, highlightthickness=0)
canvas.pack()
tk.update()

class Button:
    def __init__(self, pos):
        self.pos = pos
        self.open = False
        self.canvas = canvas
        self.id = canvas.create_rectangle(pos[0], pos[1], pos[0]+100, pos[1]+100, fill='blue')
        # 仅给当前按钮的矩形绑定点击事件
        self.canvas.tag_bind(self.id, "<Button-1>", self.action)
    
    def action(self, event):
        # 这里编写你的按钮点击逻辑,比如切换状态
        self.open = not self.open
        # 示例:通过颜色变化直观展示状态
        fill_color = 'red' if self.open else 'blue'
        self.canvas.itemconfig(self.id, fill=fill_color)

效果说明

修改后,只有当你点击某个按钮的蓝色矩形区域时,该按钮的action方法才会被触发,对应的self.open变量才会变更,不会再出现多个变量被意外修改的情况。

内容的提问来源于stack exchange,提问作者Ansh Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:04:58