如何在循环中创建可访问变量?解决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
相关产品推荐
相关产品推荐

