【问题标题】:Python (Tkinter)- Create Checkbox list from listboxPython (Tkinter) - 从列表框创建复选框列表
【发布时间】:2018-10-09 18:34:50
【问题描述】:

我想为每个列表框项创建一个复选框列表。因此,我创建了一个包含 4 个不同项目的列表框,“一”、“二”、“三”、“四”。我想为每个列表框条目列出相应的复选框项目。当我点击一个列表框条目时,它的右侧应该有一个复选框列表,当我点击一个不同的列表框条目时,它应该有一个独立于其他列表框项目的复选框列表。所有复选框列表都是相互独立的,这意味着您可以在选择第一个列表框条目时选中 4 个复选框,但是当我选择第二个列表框条目时,它应该显示 0 个已选中的内容(因为它们是独立的)。

import tkinter
from tkinter import *


master = tkinter.Tk()
master.geometry("750x500")

listbox = Listbox(master)
listbox.place(x=3,y=0)


for item in ["one", "two", "three", "four"]:
    listbox.insert(END, item)

enable = {'button 1','button 2', 'button 3'}

def onselect(evt):
    # Note here that Tkinter passes an event object to onselect()
    w = evt.widget
    x=0
    index = int(w.curselection()[0])
    value = w.get(index)
    print ('You selected item %d: "%s"' % (index, value))
    for item in enable:
        checkboxes = Checkbutton(master, text=item, variable=item)
        checkboxes.place(x=300,y=0+x)
        x+=50

listbox.bind('<<ListboxSelect>>', onselect)

print(enable)

mainloop()

【问题讨论】:

    标签: python tkinter listbox


    【解决方案1】:

    有趣的问题,我已经研究了 30 分钟。当然有几种方法,这里可能是最短和最动态的:

    #!/usr/bin/env python3
    
    import tkinter
    from tkinter import *
    
    master = tkinter.Tk()
    master.geometry("750x500")
    
    listbox = Listbox(master)
    listbox.place(x=3,y=0)
    
    enable = ['button 1', 'button 2', 'button 3']
    list_for_listbox = ["one", "two", "three", "four"]
    
    for item in list_for_listbox:
        listbox.insert(END, item)
        for y in enable:
            globals()["var{}{}".format(item, y)] = BooleanVar()
            globals()["checkbox{}{}".format(item, y)] = Checkbutton(master, text=y, variable=globals()["var{}{}".format(item, y)])
    
    def onselect(evt):
        # Note here that Tkinter passes an event object to onselect()
        w = evt.widget
        x=0
        index = int(w.curselection()[0])
        value = w.get(index)
        print ('You selected item %d: "%s"' % (index, value))
    
        for y in enable:
            for item in list_for_listbox:
                globals()["checkbox{}{}".format(item, y)].place_forget()
            globals()["checkbox{}{}".format(value, y)].place(x=300,y=0+x)
            x+=50
    
    listbox.bind('<<ListboxSelect>>', onselect)
    
    print(enable)
    
    mainloop()
    

    您通过globals()["var{}{}".format(item, y)]访问变量

    示例:

    for item in list_for_listbox:
        for y in enable:
            print(item + " [" + y + "] " + str(globals()["var{}{}".format(item, y)].get()))
    

    【讨论】:

    • 你能告诉我如何将滚动条添加到每个列表框项目至少 20 个复选框的列表中吗?我希望复选框位于某种可以滚动的文本小部件中。
    • 那么应该是左边的列表滚动还是右边的勾选按钮堆积?
    • 我有一个关于 qour 滚动条问题的答案,但是您能否为您的问题打开一个新页面,这样我就可以回答它而不必发表评论?您可以在此处将新问题的链接作为评论发布。谢谢。
    • stackoverflow.com/questions/52760572/… 这是给你的新帖子。
    【解决方案2】:

    看起来你的程序需要记住一些状态。

    您可以将BooleanVar() 传递给Checkbutton 小部件,该小部件将使BooleanVar 保持最新状态。

    #!/usr/bin/env python3
    
    import tkinter
    from tkinter import *
    
    master = tkinter.Tk()
    master.geometry("750x500")
    
    listbox = Listbox(master)
    listbox.place(x=3, y=0)
    
    gui_state = {
        "one": {
            'button 1': BooleanVar(),
            'button 2': BooleanVar(),
            'button 3': BooleanVar(),
        },
        "two": {
            'button 1': BooleanVar(),
            'button 2': BooleanVar(),
            'button 3': BooleanVar(),
        },
        "three": {
            'button 1': BooleanVar(),
            'button 2': BooleanVar(),
            'button 3': BooleanVar(),
        },
        "four": {
            'button 1': BooleanVar(),
            'button 2': BooleanVar(),
            'button 3': BooleanVar(),
        },
    }
    
    for item in gui_state.keys():
        listbox.insert(END, item)
    
    
    def bind_checkboxen(master, category):
        # render checkboxes for category. Mutate category when checkboxes are toggled.
        global checkboxes
    
        # delete old checkboxes
        for checkbox in checkboxes:
            checkbox.destroy()
        checkboxes = []
    
        x = 0
    
        # create new ones based on category fields
        for key in category.keys():
            checkbox = Checkbutton(master, text=key, variable=category[key])
            checkbox.place(x=300, y=0 + x)
            checkboxes.append(checkbox)
            x += 50
    
    
    checkboxes = []
    
    
    def onselect(evt):
        # Note here that Tkinter passes an event object to onselect()
        w = evt.widget
        index = int(w.curselection()[0])
        value = w.get(index)
        print('You selected item %d: "%s"' % (index, value))
        bind_checkboxen(master, gui_state[value])
    
    
    listbox.bind('<<ListboxSelect>>', onselect)
    
    mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2012-12-30
      • 2017-12-11
      • 1970-01-01
      • 2017-11-16
      • 2019-04-16
      • 1970-01-01
      相关资源
      最近更新 更多