【问题标题】:Tkinter Checkbutton variableTkinter Checkbutton 变量
【发布时间】:2018-10-26 23:23:47
【问题描述】:

我不擅长 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 是如何工作的。

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

有没有更好的方法来做到这一点?提前致谢。

【问题讨论】:

  • 试试visible = [IntVar(value=1) for i in range(numLevels)],或者只是check.var = IntVar(value=1)。我认为您当前的numLevels * [IntVar(value=1)] 有问题。

标签: python python-2.7 tkinter


【解决方案1】:

这是this 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)]

【讨论】:

    猜你喜欢
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2020-11-30
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2016-02-16
    相关资源
    最近更新 更多