Python Tkinter网格按钮点击仅传递最后一个按钮位置如何解决?
问题原因
这个现象是Python闭包的延迟绑定特性导致的:你在循环中定义的所有lambda函数,引用的x、y都是循环变量本身,等到点击按钮触发lambda执行时,循环已经执行完毕,所以拿到的永远是循环结束后的最终值。
解决方法
你的代码已经做了一半的正确处理:给lambda定义了column=x、row=y两个默认参数,默认参数会在lambda定义(也就是每次循环迭代)时就完成赋值,刚好可以保存当前迭代的坐标值,只需要修改调用explore的入参即可:
把你代码中最后循环里的这一行:
add_button.config(command=lambda column=x, row=y: explore(x, y))
修改为:
add_button.config(command=lambda column=x, row=y: explore(column, row))
可选替代方案
如果不想处理lambda的绑定问题,也可以用functools.partial实现参数绑定,写法更不容易出错:
- 先在代码开头导入partial:
from functools import partial
- 把按钮绑定命令的代码改成:
add_button.config(command=partial(explore, x, y))
partial会在定义时就把当前迭代的x、y值直接绑定到explore函数上,不会出现延迟绑定问题。
内容的提问来源于stack exchange,提问作者Jochem van Dolder
相关产品推荐
相关产品推荐

