使用Tkinter创建复选框,然后将所选框的值放入列表中

2024-10-02 08:31:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从列表中创建复选框。(biomelis_ = ['Arctic','Hill','Coast', 'Desert', 'Forest','Grassland', 'Mountain', 'Swamp', 'Underdark','Underwater', 'Urban' ]

然后我想勾选这些框并按“go”。我正试图使输出成为一个列表。例如,如果我选中“北极”、“丘陵”和“海岸”,我的输出将是['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”,而不是列表中的单个项。同时,所有复选框同时选中和取消选中


Tags: textgo列表vardefbuttonrootitem
3条回答

您可以将onvalueoffvalue分配给选中按钮。如果将onvalue设置为要检索的值,将off值设置为空字符串,则获取值变得非常简单

我们要做的第一件事是扔掉使用exec的代码块。这根本没有必要。我们将在创建复选按钮的同时创建变量,并将它们附加到列表中

其次,我们将直接在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

该循环可以简化为以下一行代码,但如果您刚开始使用python,则更难阅读:

def sel():
    return [var.get() for var in vars if var.get()]

在我的解决方案中,我将BooleanVar作为单独的Checkbutton分配给每个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()

这可以解决您的问题,但我认为有更安全、更好的方法:

顺便说一句,也许你不知道如何使用variableread some documents

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()


相关问题 更多 >

    热门问题