tkinter 遍历获取多个Checkbutton的值(选中或未选中)

创建等长的变量列表以达到遍历获取Checkbutton状态值的效果

起初,我是想绕过给Checkbutton定义变量并且不给其variable定义变量名,直接获取多个Checkbutton的选中状态,发现只能成功一半,结果见下

from tkinter import *

root = Tk()

items = {'python': 1, 'perl': 2, 'C': 3, 'R': 4}
vars = []
for i in range(len(items)):
    vars.append(IntVar())
print(vars)
for var in vars:
    print(var.get())
for key, value in items.items():
    Checkbutton(root, text=key, onvalue=value, variable=vars[list(items.keys()).index(key)]).grid(sticky=W)


def show():
    for new_var in vars:
        print(new_var.get())


Button(root, text='Show', command=show).grid(sticky=W)

root.mainloop()
  • 可以看到,我用字典的键值对创建多个Checkbutton组件
items = {'python': 1, 'perl': 2, 'C': 3, 'R': 4}
  • 因为无法给这些Checkbutton定义变量名,所以我创建一个相同长度的变量列表,利用索引将组件和变量绑定
vars = []
for i in range(len(items)):
    vars.append(IntVar())
print(vars)
  • 下面是创建的变量列表,可以看到没有重复
[<tkinter.IntVar object at 0x00000282B8C54CD0>, <tkinter.IntVar object at 0x00000282B8CB5970>, <tkinter.IntVar object at 0x00000282B8CB5A00>, <tkinter.IntVar object at 0x00000282B8CB5880>]
  • 并且,可以先看一下所有Checkbutton的初始状态,即未选中时的值。
for var in vars:
    print(var.get())
  • 接着,对字典键值对遍历并创建Checkbutton组件,利用key的索引将变量列表绑定到各个Checkbutton
for key, value in items.items():
    Checkbutton(root, text=key, onvalue=value, variable=vars[list(items.keys()).index(key)]).grid(sticky=W)

因为无法直接对字典使用index,索引退而求其次,使用了key,当然也可以用value

以上,就可以给每个Checkbutton绑定一个IntVar变量,这些变量储存在变量列表vars里,后续只需要读取vars就可以获取所有Checkbutton的选中情况以及值

这里我创建了一个Button用来展示vars列表

def show():
    for new_var in vars:
        print(new_var.get())


Button(root, text='Show', command=show).grid(sticky=W)

运行如下:
可以看到,主窗口里已经创建了Checkbutton和Button,并且输出变量列表vars的对象和Checkbutton的初始值。
在这里插入图片描述
在这里插入图片描述
随便选取几个Checkbutton,点击show,查看vars变化。
在这里插入图片描述
没有问题!

总结:虽然无法对Checkbutton组件直接提取状态值,但在实际应用中,Checkbutton的数量可能是由其他选择决定数量时,这种情况无法用变量名逐一确定Checkbutton,却可以通过变量列表绑定并读取Checkbutton的选中状态,即可达到遍历获取Checkbutton值的效果


版权声明:本文为whitedrogen原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。