创建等长的变量列表以达到遍历获取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值的效果