Tkinter循环创建可点击Label点击时行列值始终为最终值如何修复
问题原因
这个问题是Python中闭包的延迟绑定特性导致的:你在lambda表达式里引用的row和col变量,不会在lambda定义的时候就捕获当前循环的取值,只会在lambda被调用(也就是点击Label触发事件)的时候才会去读取变量的最终值,等循环跑完后row和col都固定为最后一次迭代的2、2,所以所有点击事件都会输出相同的结果。
修复方法
只需要给lambda添加默认参数,利用Python函数默认参数在定义时就会计算赋值的特性,把当前循环的row和col值绑定到lambda的局部变量上即可,修改绑定事件的代码如下:
labels[-1].bind( "<Button-1>", # 新增默认参数r和c,定义时就存入当前的row、col值 lambda e, r=row, c=col: print_it(r, c) )
完整可运行的修复后代码
from tkinter import * def print_it(row, col): print(row, col) root = Tk() sizex = 700 sizey = 400 posx = 0 posy = 0 root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy)) canvas_area = Canvas(root) canvas_area.grid(row=1, column=1) labels = [] for row in range(3): for col in range(3): labels.append(Label(canvas_area, text=f"Row, Col: {row},{col}", bd=0)) labels[-1].grid(row=row, column=col) labels[-1].bind( "<Button-1>", lambda e, r=row, c=col: print_it(r, c), ) root.mainloop()
内容的提问来源于stack exchange,提问作者Godinator
相关产品推荐
相关产品推荐

