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

如何在循环中创建可访问变量?解决Checkbutton矩阵取值始终为0问题

问题原因

你把IntVar的初始值(0)直接存在了x字典里,之后不管复选框状态怎么变,x里的数值不会自动更新——因为get()方法只在你调用的那一刻返回当前值,不是实时绑定的。

修正方案

方案1:直接访问var字典里的IntVar对象获取最新值

把按钮的command改成直接调用var[1,1].get(),这样每次点击都会实时获取当前复选框的状态:

x = dict()
var = dict()
for i in range(1, ex +1):
    for j in range(1, ey +1):
        Label(root, text=i, bg="#B8B8B8").place(x=i*25+ 3, y=10)
        Label(root, text=j, bg="#B8B8B8").place(x=10, y=j*25+ 3)
        var[i, j] = IntVar()
        # 这行可以删掉,因为现在不用x存固定值了
        # x[i,j] = var[i, j].get()
        Checkbutton(root, bg="#B8B8B8", variable=var[i,j]).place(x=i*25, y=j*25)

# 点击时直接获取var里的实时值
Button(root, text="click", command=lambda: print(var[1, 1].get()) ).pack()

方案2:让x存储IntVar对象,而非固定数值

如果一定要用x字典来管理,就把x[i,j]指向IntVar对象本身,之后获取值时再调用get():

x = dict()
var = dict()
for i in range(1, ex +1):
    for j in range(1, ey +1):
        Label(root, text=i, bg="#B8B8B8").place(x=i*25+ 3, y=10)
        Label(root, text=j, bg="#B8B8B8").place(x=10, y=j*25+ 3)
        var[i, j] = IntVar()
        x[i,j] = var[i, j]  # 存对象,不是存初始值
        Checkbutton(root, bg="#B8B8B8", variable=var[i,j]).place(x=i*25, y=j*25)

# 点击时调用get()获取最新值
Button(root, text="click", command=lambda: print(x[1, 1].get()) ).pack()
关键说明
  • IntVar是Tkinter的可变变量对象,它会和复选框的状态绑定,只有调用get()方法时才会返回当前的实时状态。
  • 如果你直接把get()的结果存在普通变量或字典里,这个值就是固定的,不会随复选框状态变化自动更新。

内容的提问来源于stack exchange,提问作者gamerfan82

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:35:05