如何获取 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_listcb_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 从您的列表中创建复选按钮 项目。此函数执行以下操作:

  1. 销毁所有之前的复选按钮
  2. 清除列表框
  3. 创建新的复选按钮
  4. 更改显示按钮的命令

您会注意到 display 函数现在在参数中包含 cb_listcb_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,请尝试使用可迭代类型,例如 dictionary。您还应该需要将 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 完成此操作后,该方法首先 deleteing 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()

textCheckbutton 小部件的一个选项,这意味着您可以使用 cget(widget.cget('option')) 或简单地 widget['option'].