变量无操作自动变更问题及记忆游戏Button类代码技术咨询
问题根源与修复方案
我一眼就发现了导致你“变量自动变更”的核心问题——你在Button类的__init__方法里误用了bind_all!
问题分析
每次创建一个Button实例时,代码里的self.canvas.bind_all("<Button-1>", self.action)都会给整个Tkinter窗口的左键点击事件绑定一次当前实例的action方法。这意味着:
- 当你点击窗口任意位置时,所有已创建的
Button实例的action方法都会被触发 - 多个实例的
self.open变量会被同时修改,看起来就像是“没操作却自动变更”
修复步骤
你需要给每个按钮对应的矩形元素单独绑定点击事件,而不是给整个窗口绑定。具体修改如下:
- 替换绑定方式:把
bind_all改成tag_bind,只给当前按钮的矩形绑定点击事件 - 调整
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
相关产品推荐
相关产品推荐

