使用Tkinter更新复选框结果
我正在尝试创建一个图形用户界面(GUI),这个界面会根据一个CSV文件生成复选框,每个选项都有一个对应的值。我需要一种方法,当选中一个选项时,这个选项的值会被添加到一个列表中,这样我就可以对这些值进行求和,并在后续的计算中使用。
这是复选框生成的代码:
for row in data:
if row[2] == "g":
v=IntVar()
Tkinter.Checkbutton(top,text=row[0],height=1,variable=v).grid(row=(row[3]),column=row[4],sticky=W)
if v.get():
tags.append(row[1])
在这里,“tags”是要填充的列表,里面的值来自于row[1]。row[3]和row[4]只是一些列和行的设置。
我希望我能清楚地表达我想要实现的目标。谢谢大家提供的任何建议 :)
1 个回答
1
这个代码不工作的原因有两个:
1) 变量 v
的值只会和最后一个创建的复选框(Checkbutton)绑定在一起。v
只有一个,不管你创建了多少次,它只会记住最后一次的值。
2) 因为这一行:
if v.get():
tags.append(row[1])
只会在复选框创建的时候被计算,而不是在你点击的时候。
要解决这个问题,你有几个选择。其中一个选择是给复选框的点击事件指定一个 command
,这样可以把 v
和 row[1]
作为参数传递给一个回调函数,然后这个函数会把 row[1]
的值添加到你的列表里。
这里有一个例子,你可能需要根据你的代码进行调整:
def callback(v,rowValue):
if v.get():
tags.append(rowValue)
for row in data:
if row[2] == "g":
v=IntVar()
rowValue = row[1]
c=Checkbutton(root,
text=row[0],
height=1,
variable=v,
command=lambda v=v, rowValue=rowValue: callback(v, rowValue))
c.grid(row=(row[3]),column=row[4],sticky=W)