使用Tkinter更新复选框结果

0 投票
1 回答
1012 浏览
提问于 2025-04-17 23:53

我正在尝试创建一个图形用户界面(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,这样可以把 vrow[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)

撰写回答