Python (Tkinter) - Создать список флажков из списка - PullRequest
0 голосов
/ 09 октября 2018

Я хочу создать список флажков для каждого элемента списка.Итак, у меня есть список, созданный из 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()

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Интересный вопрос, и я работаю над ним в течение 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()))
0 голосов
/ 09 октября 2018

Похоже, что вашей программе нужно запомнить какое-то состояние.

Вы можете передать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...