Python记忆游戏开发:如何调用hide_text函数并传入点击的按钮作为参数
解决Tkinter记忆游戏中按钮点击传递自身参数的问题
我来帮你搞定这个问题,你的核心需求是让点击按钮时把该按钮对象传递给hide_text函数,同时还要修正代码里的其他小问题,比如局部变量访问错误和按钮布局的逻辑问题。
现有代码的核心问题
- 按钮的
command绑定的lambda没有传递当前按钮对象给hide_text,导致函数无法操作目标按钮 hide_text里试图修改game函数内的局部变量posisonx和count,这会引发NameError,而且这两个变量是用来布局按钮的,点击按钮时根本不需要修改它们- 按钮布局的循环逻辑有问题,
count没有在每次循环后递增,会导致按钮重复布局在同一位置
修正后的完整代码
from tkinter import * from random import shuffle root = Tk() a = list(range(1, 19)) a = list(a) + list(a) shuffle(a) def game(): count = 0 posisonx = 0 posisony = 0 for i in a: # 创建按钮时,用lambda默认参数传递当前按钮对象,避免延迟绑定问题 button = Button(root, text=f' {i} ', command=lambda btn=button: hide_text(btn)) button.grid(row=posisony, column=posisonx) # 更新布局位置 posisonx += 1 count += 1 # 每6个按钮换行 if count == 6: count = 0 posisonx = 0 posisony += 1 def hide_text(s): # 修改传入的按钮文本为空 s.config(text='') game() root.mainloop()
关键修改点解释
按钮参数传递:
把command=lambda: hide_text()改成command=lambda btn=button: hide_text(btn)。这里用默认参数btn=button是为了避免Tkinter lambda的延迟绑定问题——如果直接写lambda: hide_text(button),所有按钮最终都会引用循环最后一个按钮对象,而不是各自的按钮。修复布局逻辑:
把posisonx和posisony的初始化移到循环外,并且在每次循环后递增posisonx和count,确保按钮能正确排列成多行多列。移除错误的变量修改:
删除hide_text里的posisonx += 1和count += 1,因为这两个变量是game函数的局部变量,点击按钮时不需要修改它们,而且直接访问会报错。hide_text只需要专注于修改传入按钮的文本即可。
这样修改后,点击任意按钮,该按钮的文本就会被隐藏,完全符合你的需求。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

