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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:57:02