如何获取 Checkbuttons 的文本?
How to get the text of Checkbuttons?
复选按钮是动态生成的,它们从 python 列表中获取文本。
我需要一个逻辑来捕获选定的复选按钮文本。
根据我的研究,他们到处都在返回复选框的状态而不是文本。
请帮忙。
cb_list =['pencil','pen','book','bag','watch','glasses','passport','clothes','shoes','cap']
try:
r = 0
cl = 1
for op in cb_list:
cb = Checkbutton(checkbutton_frame, text=op, relief=RIDGE)
cb.grid(row=r, column=cl, sticky="W")
r = r + 1
except Exception as e:
logging.basicConfig(filename=LOG_FILENAME, level=logging.ERROR)
logging.error(e)
# print (e)
selected_item = Text(self, width=30, height=20, wrap=WORD)
selected_item.grid(row=1, column=6, padx=20, pady=20, columnspan=2, sticky=E)
display_button = Button(self, text='DISPLAY', command=display()
convert_button.grid(row=1, column=8, padx=20, pady=20)
想法是将一个 BooleanVar
关联到每个复选按钮并将它们存储在列表 cb_var
中。然后,要显示选中的项目,我们只需要清除显示框(我用了一个Listbox
)然后同时循环通过cb_list
和cb_var
来确定哪些项目被选中:
import tkinter as tk
root = tk.Tk()
checkbutton_frame = tk.Frame(root)
checkbutton_frame.grid(row=1, column=0)
def display():
# clear listbox
selected_item.delete(0, 'end')
# add selected items in listbox
for text, var in zip(cb_list, cb_var):
if var.get():
# the checkbutton is selected
selected_item.insert('end', text)
cb_list = ['pencil','pen','book','bag','watch','glasses','passport','clothes','shoes','cap']
cb_var = [] # to store the variables associated to the checkbuttons
cl = 1
for r, op in enumerate(cb_list):
var = tk.BooleanVar(root, False)
cb = tk.Checkbutton(checkbutton_frame, variable=var, text=op, relief='ridge')
cb.grid(row=r, column=cl, sticky="w")
cb_var.append(var)
selected_item = tk.Listbox(root, width=30, height=20)
selected_item.grid(row=1, column=6, padx=20, pady=20, columnspan=2, sticky='e')
display_button = tk.Button(root, text='DISPLAY', command=display)
display_button.grid(row=1, column=8, padx=20, pady=20)
root.mainloop()
编辑:如果您希望能够轻松更改项目列表,您可以使用函数 init_checkbuttons
从您的列表中创建复选按钮
项目。此函数执行以下操作:
- 销毁所有之前的复选按钮
- 清除列表框
- 创建新的复选按钮
- 更改显示按钮的命令
您会注意到 display
函数现在在参数中包含 cb_list
和 cb_var
,因此您可以更改它们。
import tkinter as tk
root = tk.Tk()
checkbutton_frame = tk.Frame(root)
checkbutton_frame.grid(row=1, column=0)
def display(cb_list, cb_var):
# clear listbox
selected_item.delete(0, 'end')
# add selected items in listbox
for text, var in zip(cb_list, cb_var):
if var.get():
# the checkbutton is selected
selected_item.insert('end', text)
def init_checkbuttons(cb_list, cl=1):
# destroy previous checkbuttons (assuming that checkbutton_frame only contains the checkbuttons)
cbs = list(checkbutton_frame.children.values())
for cb in cbs:
cb.destroy()
# clear listbox
selected_item.delete(0, 'end')
# create new checkbuttons
cb_var = [] # to store the variables associated to the checkbuttons
for r, op in enumerate(cb_list):
var = tk.BooleanVar(root, False)
cb = tk.Checkbutton(checkbutton_frame, variable=var, text=op, relief='ridge')
cb.grid(row=r, column=cl, sticky="w")
cb_var.append(var)
# change display command
display_button.configure(command=lambda: display(cb_list, cb_var))
cb_list = ['pencil', 'pen', 'book', 'bag', 'watch', 'glasses', 'passport', 'clothes', 'shoes', 'cap']
cb_list2 = ['ball', 'table', 'bat']
selected_item = tk.Listbox(root, width=30, height=20)
selected_item.grid(row=1, column=6, padx=20, pady=20, columnspan=2, sticky='e')
display_button = tk.Button(root, text='DISPLAY')
display_button.grid(row=1, column=8, padx=20, pady=20)
tk.Button(root, text='Change list', command=lambda: init_checkbuttons(cb_list2)).grid(row=2, column=8)
init_checkbuttons(cb_list)
root.mainloop()
不要覆盖相同的变量,cb
,请尝试使用可迭代类型,例如 dict
ionary。您还应该需要将 Checkbutton
的值附加到 tkinter variable class,例如 BooleanVar
,以便轻松跟踪其状态和值。
下面的代码生成一个 GUI,每次选择 Checkbutton
时都会重新写入 Text
。它首先使用列表 cb_list
中的项目填充字典 cbs
作为键,并使用 tk.Checkbutton
对象作为值。
Checkbutton
个对象,因此每个对象都附加到一个特殊对象,Tkinter 变量 class,BooleanVar
,它有一个 get
方法 returns 调用时附加到的 Checkbutton
当前值。在这种情况下,每个 Checkbutton
如果选中则保留 True
,如果未选中则保留 False
作为其值。
每个 Checkbutton
还附加到一个方法 update_text
,当按下任何 Checkbutton
时调用该方法。在该方法中,对于 cbs
中的每个 Checkbutton
,它首先检查 Checkbutton
是否具有 True
值,如果是,它将其 text
附加到 [=35] =].在为所有 Checkbuttons
完成此操作后,该方法首先 delete
ing Text
小部件中的整个文本,然后将 _string
放入 Text
.
代码:
import tkinter as tk
def update_text():
global cbs
_string = ''
for name, checkbutton in cbs.items():
if checkbutton.var.get():
_string += checkbutton['text'] + '\n'
text.delete('1.0', 'end')
text.insert('1.0', _string)
if __name__ == '__main__':
root = tk.Tk()
text = tk.Text(root)
cb_list =['pencil','pen','book','bag','watch','glasses','passport',
'clothes','shoes','cap']
cbs = dict()
for i, value in enumerate(cb_list):
cbs[value] = tk.Checkbutton(root, text=value, onvalue=True,
offvalue=False, command=update_text)
cbs[value].var = tk.BooleanVar(root, value=False)
cbs[value]['variable'] = cbs[value].var
cbs[value].grid(row=i, column=0)
text.grid()
root.mainloop()
text
是 Checkbutton
小部件的一个选项,这意味着您可以使用 cget
(widget.cget('option')
) 或简单地 widget['option']
.
复选按钮是动态生成的,它们从 python 列表中获取文本。 我需要一个逻辑来捕获选定的复选按钮文本。 根据我的研究,他们到处都在返回复选框的状态而不是文本。 请帮忙。
cb_list =['pencil','pen','book','bag','watch','glasses','passport','clothes','shoes','cap']
try:
r = 0
cl = 1
for op in cb_list:
cb = Checkbutton(checkbutton_frame, text=op, relief=RIDGE)
cb.grid(row=r, column=cl, sticky="W")
r = r + 1
except Exception as e:
logging.basicConfig(filename=LOG_FILENAME, level=logging.ERROR)
logging.error(e)
# print (e)
selected_item = Text(self, width=30, height=20, wrap=WORD)
selected_item.grid(row=1, column=6, padx=20, pady=20, columnspan=2, sticky=E)
display_button = Button(self, text='DISPLAY', command=display()
convert_button.grid(row=1, column=8, padx=20, pady=20)
想法是将一个 BooleanVar
关联到每个复选按钮并将它们存储在列表 cb_var
中。然后,要显示选中的项目,我们只需要清除显示框(我用了一个Listbox
)然后同时循环通过cb_list
和cb_var
来确定哪些项目被选中:
import tkinter as tk
root = tk.Tk()
checkbutton_frame = tk.Frame(root)
checkbutton_frame.grid(row=1, column=0)
def display():
# clear listbox
selected_item.delete(0, 'end')
# add selected items in listbox
for text, var in zip(cb_list, cb_var):
if var.get():
# the checkbutton is selected
selected_item.insert('end', text)
cb_list = ['pencil','pen','book','bag','watch','glasses','passport','clothes','shoes','cap']
cb_var = [] # to store the variables associated to the checkbuttons
cl = 1
for r, op in enumerate(cb_list):
var = tk.BooleanVar(root, False)
cb = tk.Checkbutton(checkbutton_frame, variable=var, text=op, relief='ridge')
cb.grid(row=r, column=cl, sticky="w")
cb_var.append(var)
selected_item = tk.Listbox(root, width=30, height=20)
selected_item.grid(row=1, column=6, padx=20, pady=20, columnspan=2, sticky='e')
display_button = tk.Button(root, text='DISPLAY', command=display)
display_button.grid(row=1, column=8, padx=20, pady=20)
root.mainloop()
编辑:如果您希望能够轻松更改项目列表,您可以使用函数 init_checkbuttons
从您的列表中创建复选按钮
项目。此函数执行以下操作:
- 销毁所有之前的复选按钮
- 清除列表框
- 创建新的复选按钮
- 更改显示按钮的命令
您会注意到 display
函数现在在参数中包含 cb_list
和 cb_var
,因此您可以更改它们。
import tkinter as tk
root = tk.Tk()
checkbutton_frame = tk.Frame(root)
checkbutton_frame.grid(row=1, column=0)
def display(cb_list, cb_var):
# clear listbox
selected_item.delete(0, 'end')
# add selected items in listbox
for text, var in zip(cb_list, cb_var):
if var.get():
# the checkbutton is selected
selected_item.insert('end', text)
def init_checkbuttons(cb_list, cl=1):
# destroy previous checkbuttons (assuming that checkbutton_frame only contains the checkbuttons)
cbs = list(checkbutton_frame.children.values())
for cb in cbs:
cb.destroy()
# clear listbox
selected_item.delete(0, 'end')
# create new checkbuttons
cb_var = [] # to store the variables associated to the checkbuttons
for r, op in enumerate(cb_list):
var = tk.BooleanVar(root, False)
cb = tk.Checkbutton(checkbutton_frame, variable=var, text=op, relief='ridge')
cb.grid(row=r, column=cl, sticky="w")
cb_var.append(var)
# change display command
display_button.configure(command=lambda: display(cb_list, cb_var))
cb_list = ['pencil', 'pen', 'book', 'bag', 'watch', 'glasses', 'passport', 'clothes', 'shoes', 'cap']
cb_list2 = ['ball', 'table', 'bat']
selected_item = tk.Listbox(root, width=30, height=20)
selected_item.grid(row=1, column=6, padx=20, pady=20, columnspan=2, sticky='e')
display_button = tk.Button(root, text='DISPLAY')
display_button.grid(row=1, column=8, padx=20, pady=20)
tk.Button(root, text='Change list', command=lambda: init_checkbuttons(cb_list2)).grid(row=2, column=8)
init_checkbuttons(cb_list)
root.mainloop()
不要覆盖相同的变量,cb
,请尝试使用可迭代类型,例如 dict
ionary。您还应该需要将 Checkbutton
的值附加到 tkinter variable class,例如 BooleanVar
,以便轻松跟踪其状态和值。
下面的代码生成一个 GUI,每次选择 Checkbutton
时都会重新写入 Text
。它首先使用列表 cb_list
中的项目填充字典 cbs
作为键,并使用 tk.Checkbutton
对象作为值。
Checkbutton
个对象,因此每个对象都附加到一个特殊对象,Tkinter 变量 class,BooleanVar
,它有一个 get
方法 returns 调用时附加到的 Checkbutton
当前值。在这种情况下,每个 Checkbutton
如果选中则保留 True
,如果未选中则保留 False
作为其值。
每个 Checkbutton
还附加到一个方法 update_text
,当按下任何 Checkbutton
时调用该方法。在该方法中,对于 cbs
中的每个 Checkbutton
,它首先检查 Checkbutton
是否具有 True
值,如果是,它将其 text
附加到 [=35] =].在为所有 Checkbuttons
完成此操作后,该方法首先 delete
ing Text
小部件中的整个文本,然后将 _string
放入 Text
.
代码:
import tkinter as tk
def update_text():
global cbs
_string = ''
for name, checkbutton in cbs.items():
if checkbutton.var.get():
_string += checkbutton['text'] + '\n'
text.delete('1.0', 'end')
text.insert('1.0', _string)
if __name__ == '__main__':
root = tk.Tk()
text = tk.Text(root)
cb_list =['pencil','pen','book','bag','watch','glasses','passport',
'clothes','shoes','cap']
cbs = dict()
for i, value in enumerate(cb_list):
cbs[value] = tk.Checkbutton(root, text=value, onvalue=True,
offvalue=False, command=update_text)
cbs[value].var = tk.BooleanVar(root, value=False)
cbs[value]['variable'] = cbs[value].var
cbs[value].grid(row=i, column=0)
text.grid()
root.mainloop()
text
是 Checkbutton
小部件的一个选项,这意味着您可以使用 cget
(widget.cget('option')
) 或简单地 widget['option']
.