Python tkinter - 显示所有选中的复选按钮

Python tkinter - Display all the checkbuttons selected

我创建了一个 GUI,其中包含 2 个输入框和一个带滚动条的复选按钮列表(源自列表 'a')。现在,我想显示所有已选中的复选按钮。


def sel(x):
    selection = "You selected the option " + str(x)
    label.config(text = selection)
    
from tkinter import *
import tkinter as tk
from tkinter.scrolledtext import ScrolledText

root = Tk()

Label(root, text='Date from (format: 01-Apr-2022)').place(x=120,y=50)
Label(root, text='Date till (format: 21-Apr-2022)').place(x=120,y=150)
e1 = Entry(root)
e2 = Entry(root)
e1.place(x=300,y=50)
e2.place(x=300, y=150)


text = ScrolledText(root, width=50, height=60)
text.pack()


label = Label(root)
label.place(x=100, y=450)

b = [IntVar() for x in a[:10]]
for i in range(len(a[:10])):
    cb = tk.Checkbutton(text, text=a[i], variable=b[i], bg='white', anchor='w', onvalue = 1, offvalue = 0, command=sel(a[i]))
    text.window_create('end', window=cb)
    text.insert('end', '\n')

root.mainloop()

我想出了上面的代码,但是生成的 GUI(下面)没有按预期工作。即使没有选择它,它也只显示最底部的复选按钮。此外,选择或取消选择任何其他复选按钮没有任何效果。

使用列表 a 的示例列表,因为您没有在问题中提供它。

修复

由于您要为函数提供参数,因此可以使用 python lambdas。 目前,您没有将函数传递给 CheckButton 的命令属性,而是传递 sel().

的返回值

参考

解决方案

您可以迭代 IntVar 列表并决定选择哪些,而不是将名称作为参数传递给函数。

import tkinter as tk
from tkinter.scrolledtext import ScrolledText

root = tk.Tk()

def refresh():
    selected = []
    for i in range(len(a)):
        if b[i].get():
            selected.append(a[i])
            
    if len(selected) > 1:
        label.config(text=(", ".join(selected) + " are selected"))
    elif len(selected) == 1:
        label.config(text=(selected[0] + " is selected"))
    else:
        label.config(text="")

tk.Label(root, text='Date from (format: 01-Apr-2022)').place(x=120,y=50)
tk.Label(root, text='Date till (format: 21-Apr-2022)').place(x=120,y=150)
e1 = tk.Entry(root)
e2 = tk.Entry(root)
e1.place(x=300,y=50)
e2.place(x=300, y=150)

text = ScrolledText(root, width=50, height=60)
text.pack()

label = tk.Label(root)
label.place(x=100, y=450)

a = ["test1", "test2", "test3", "test4"]
b = []

for i in a:
    var = tk.IntVar()
    b.append(var)
    cb = tk.Checkbutton(text, text=i, variable=var, bg='white', anchor='w', onvalue=1, offvalue=0, command=refresh)
    text.window_create('end', window=cb)
    text.insert('end', '\n')

root.mainloop()