Tkinter 检查复选按钮
Tkinter get checkbuttons checked
我是 Tkinter
的新手,试图获取选中的复选按钮的值。到目前为止,我可以在 Checkbutton
上使用循环,以便从列表中获取可用复选按钮的列表。如何使用按钮检测选中了哪些复选按钮?
到目前为止,这是我的代码(对于这部分):
INGREDIENTS = ['cheese', 'ham', 'pickle', 'mustard', 'lettuce']
text = Text(root, width=40, height=20)
for i in INGREDIENTS:
cb = Checkbutton(text="%s" % i, padx=0, pady=0, bd=0)
text.window_create("end", window=cb)
text.insert("end", "\n")
cb.pack()
我知道我必须使用连接到函数的按钮才能获得选中的值,但我想不出一种方法来创建函数并将其连接到复选框列表。
你能帮帮我吗?我不能使用 OOP,我的代码会被毁掉(它已经很长了,我不能重新格式化它)
谢谢你的建议。
试试这个。
正如您所说,您不希望您的代码变长。我认为这是解决您问题的方法。
仅添加两行。
INGREDIENTS = ['cheese', 'ham', 'pickle', 'mustard', 'lettuce']
text = Text(root, width=40, height=20)
for i in INGREDIENTS:
var = IntVar()
cb = Checkbutton(text="%s" % i, padx=0, pady=0, bd=0, offvalue=0,onvalue=1,variable=var)
text.window_create("end", window=cb)
text.insert("end", "\n")
cb.bind('<Button-1>',lambda e,var=var,i=i:print(f'{i} is selected') if var.get()==0 else print(f'{i} is unselected'))
cb.pack()
这会用打勾的成分填充列表,或者通过清除注释列表中的成分 0 或 1。结果可能需要是一个有用的全局变量。这取决于您的其余代码。
import tkinter as tk
root = tk.Tk()
INGREDIENTS = ['cheese', 'ham', 'pickle', 'mustard', 'lettuce']
txt = tk.Text(root, width=40, height=20)
variables = []
for i in INGREDIENTS:
variables.append( tk.IntVar( value = 0 ) )
cb = tk.Checkbutton( txt, text = i, variable = variables[-1] )
txt.window_create( "end", window=cb )
txt.insert( "end", "\n" )
txt.pack()
def read_ticks():
# result = [( ing, cb.get() ) for ing, cb in zip( INGREDIENTS, variables ) ]
result = [ ing for ing, cb in zip( INGREDIENTS, variables ) if cb.get()>0 ]
print( result )
but = tk.Button( root, text = 'Read', command = read_ticks)
but.pack()
root.mainloop()
我是 Tkinter
的新手,试图获取选中的复选按钮的值。到目前为止,我可以在 Checkbutton
上使用循环,以便从列表中获取可用复选按钮的列表。如何使用按钮检测选中了哪些复选按钮?
到目前为止,这是我的代码(对于这部分):
INGREDIENTS = ['cheese', 'ham', 'pickle', 'mustard', 'lettuce']
text = Text(root, width=40, height=20)
for i in INGREDIENTS:
cb = Checkbutton(text="%s" % i, padx=0, pady=0, bd=0)
text.window_create("end", window=cb)
text.insert("end", "\n")
cb.pack()
我知道我必须使用连接到函数的按钮才能获得选中的值,但我想不出一种方法来创建函数并将其连接到复选框列表。
你能帮帮我吗?我不能使用 OOP,我的代码会被毁掉(它已经很长了,我不能重新格式化它)
谢谢你的建议。
试试这个。 正如您所说,您不希望您的代码变长。我认为这是解决您问题的方法。
仅添加两行。
INGREDIENTS = ['cheese', 'ham', 'pickle', 'mustard', 'lettuce']
text = Text(root, width=40, height=20)
for i in INGREDIENTS:
var = IntVar()
cb = Checkbutton(text="%s" % i, padx=0, pady=0, bd=0, offvalue=0,onvalue=1,variable=var)
text.window_create("end", window=cb)
text.insert("end", "\n")
cb.bind('<Button-1>',lambda e,var=var,i=i:print(f'{i} is selected') if var.get()==0 else print(f'{i} is unselected'))
cb.pack()
这会用打勾的成分填充列表,或者通过清除注释列表中的成分 0 或 1。结果可能需要是一个有用的全局变量。这取决于您的其余代码。
import tkinter as tk
root = tk.Tk()
INGREDIENTS = ['cheese', 'ham', 'pickle', 'mustard', 'lettuce']
txt = tk.Text(root, width=40, height=20)
variables = []
for i in INGREDIENTS:
variables.append( tk.IntVar( value = 0 ) )
cb = tk.Checkbutton( txt, text = i, variable = variables[-1] )
txt.window_create( "end", window=cb )
txt.insert( "end", "\n" )
txt.pack()
def read_ticks():
# result = [( ing, cb.get() ) for ing, cb in zip( INGREDIENTS, variables ) ]
result = [ ing for ing, cb in zip( INGREDIENTS, variables ) if cb.get()>0 ]
print( result )
but = tk.Button( root, text = 'Read', command = read_ticks)
but.pack()
root.mainloop()