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 lambda
s。
目前,您没有将函数传递给 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()
我创建了一个 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 lambda
s。
目前,您没有将函数传递给 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()