首页 > 解决方案 > Tkinter Checkbutton 变量

问题描述

我不擅长 tkinter 甚至 python,所以我遇到了应该是一个简单的问题。

我的项目中间有这样的事情:

visible = numLevels * [IntVar(value=1)]

top = Toplevel()
settingslabel = Label(top, text='Settings', height=0, width=100)

for i in range(0, numLevels ):
    check = ttk.Checkbutton(settingslabel, text='Level ' + str(i), variable=visible[i])
    check.grid(column = 0, row = i)
    check.var = visible[i]

settingslabel.grid(column = 0, row=0)

我想为每个级别设置一个带有复选框的设置屏幕,同时维护一个表示每个按钮状态的整数数组。

但是,所有复选框都是同步的。这意味着,当我选中一个框时,所有其他框也会被选中。我相信这是因为复选按钮的“变量”字段。随着循环的继续, i 被更新,结果, visible[i] 也发生了变化。我想在创建复选按钮时保留变量。我不明白 tkinter/python 是如何工作的好到足以知道。

数字级别可以是任何大于 0 的整数,并且在运行时确定,所以我不能只是展开循环。

有一个更好的方法吗?提前致谢。

标签: pythonpython-2.7tkinter

解决方案


这是SO 帖子的副本,但解释如下。

这是因为你所有的盒子都共享同一个tkinter.Intvar()对象:

numlevels = 5
visible = numlevels * [IntVar(value = 1)]

for i in range(len(visible)):
    print (hex(id(visible[i]))

# Outputs:
'0x67f8190'
'0x67f8190'
'0x67f8190'
'0x67f8190'
'0x67f8190'

要解决:visible = [IntVar(value = 1) for i in range(numlevels)]


推荐阅读