Создайте чекбоксы с помощью Tkinter, а затем внесите значение выбранного ящика в список - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь создать флажки из списка. (biomelis_ = ['Arctic','Hill','Coast', 'Desert', 'Forest','Grassland', 'Mountain', 'Swamp', 'Underdark','Underwater', 'Urban' ]).

Затем я хочу установить флажки и нажать «go». Я пытаюсь получить вывод в виде списка. Например, если я проверю «Arcti c», «Hill» и «Coast», мой вывод будет ['Arctic', 'Hill', 'Coast']. Я читал документацию, но я борюсь с этим.

Вот полный код:

from tkinter import *

biomelis_ = ['Arctic', 'Hill', 'Coast', 'Desert', 'Forest', 'Grassland', 'Mountain', 'Swamp', 'Underdark', 'Underwater',
             'Urban']

root = Tk()
var = StringVar()


# var.set(biomelis_ [0])

def sel():
    biome_lis_selection = var.get()
    print(biome_lis_selection)
    return [biome_lis_selection]


for item in range(len(biomelis_)):
    l = Checkbutton(root, text=biomelis_[item], variable=var)
    print("l = Checkbutton(root, text=" + str(biomelis_[item]) + ", variable=" + str(var))
    l.pack(anchor='w')


def go():  ### runs tkinter

    biomes_Checklist = sel()
    b.config(state=NORMAL)
    b.delete('1.0', END)
    b.insert(INSERT, sel())
    b.config(state=DISABLED)


## defines go button. This launches the def go() when the go button is pressed.
go_button = Button(root, text="Go!", width=10, command=go)
go_button.pack()
b = Text(root)
b.pack()

root.mainloop()


Это та часть, с которой я борюсь, чтобы получить выбранные предметы.

l = Checkbutton(root, text=biomelis_[item], variable=var)

Возвращает 'l' вместо отдельных элементов в списке. Также все флажки ставятся и снимаются одновременно.

Ответы [ 3 ]

1 голос
/ 22 марта 2020

Вы можете назначить onvalue и offvalue для кнопки выбора. Если для onvalue установить значение, которое вы хотите получить, а для значения off - пустую строку, выборка значений станет очень простой.

Первое, что мы хотим сделать, это выбросить блок кода. который использует exec. Это просто не нужно. Мы создадим переменные в то же время, когда создадим контрольные кнопки и добавим их в список.

Во-вторых, мы будем l oop непосредственно над biomelis_ и определим onvalue для быть таким же, как текст:

vars = []
for biome in biomelis_:
    var = tk.StringVar(value="")
    vars.append(var)
    cb = tk.Checkbutton(root, text=biome, onvalue=biome, offvalue="", variable=var)
    cb.pack(side="top", anchor="w")

При этом получение значений - это просто перебор списка переменных и сохранение значений, не являющихся пустой строкой:

def sel()
    selected = []
    for var in vars:
        value = var.get()
        if value != "":
            selected.append(value)
    return selected

Чтобы l oop было сокращено до следующей строки, хотя читать сложнее, если вы только начинаете с python:

def sel():
    return [var.get() for var in vars if var.get()]
1 голос
/ 22 марта 2020

В моем решении я присваиваю BooleanVar по отдельности каждому Checkbutton для хранения текущего состояния каждого виджета (т. Е. «Отмечено» или «не отмечено») отдельно, а также сохраняю каждый из Checkbutton в списке с именем chkbtns. Это позволяет легко ссылаться на них в других функциях.

from tkinter import *

root = Tk()

biomelist = ['Arctic', 'Hill', 'Coast', 'Desert', 'Forest', 'Grassland', 'Mountain',
             'Swamp', 'Underdark', 'Underwater', 'Urban']

chkbtns = []
for biome in biomelist:
    btnvar = BooleanVar(value=False)
    chkbtn = Checkbutton(root, text=biome, variable=btnvar)
    chkbtn.var = btnvar  # Save associated tkinter variable.
    chkbtn.pack(anchor='w')
    chkbtns.append(chkbtn)

def sel():
    selected = [btn.cget('text') for btn in chkbtns if btn.var.get()]
    print(f'selected: {selected}')
    return selected

def go():
    biomes_Checklist = sel()
    b.config(state=NORMAL)
    b.delete('1.0', END)
    b.insert(INSERT, biomes_Checklist)
    b.config(state=DISABLED)

# Defines Go button. This launches the go() function when the go button is pressed.
go_button = Button(root, text="Go!", width=10, command=go)
go_button.pack()
b = Text(root)
b.pack()

root.mainloop()
0 голосов
/ 22 марта 2020

Это может решить вашу проблему, но я думаю, что есть более безопасный и хороший способ сделать это:

Кстати, возможно, вы не знаете, как использовать variable. читать некоторые документы

from tkinter import *

biomelis_ = ['Arctic', 'Hill', 'Coast', 'Desert', 'Forest', 'Grassland', 'Mountain', 'Swamp', 'Underdark', 'Underwater',
             'Urban']

biomelis_variable = [] # a list to save all the variable

root = Tk()

for i in biomelis_:
    exec('''
{0} = IntVar()
biomelis_variable.append({0}) # use exec()
'''.format(i))

def sel():
    biome_lis_selection = []
    for i in range(len(biomelis_)):
        check = biomelis_variable[i].get()
        if check:
            biome_lis_selection.append(biomelis_[i])

        # biome_lis_selection = var
    return biome_lis_selection # the selected checkbutton name


for item in range(len(biomelis_)):
    l = Checkbutton(root, text=biomelis_[item], variable=biomelis_variable[item])
    l.pack(anchor='w')


def go():  ### runs tkinter

    biomes_Checklist = sel()
    b.config(state=NORMAL)
    b.delete('1.0', END)
    b.insert(INSERT, sel())
    b.config(state=DISABLED)


## defines go button. This launches the def go() when the go button is pressed.
go_button = Button(root, text="Go!", width=10, command=go)
go_button.pack()
b = Text(root)
b.pack()

root.mainloop()


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...