tkinter ttk.Checkbutton 多选框
多选框 Checkbutton
是持有两种状态的特殊按钮,当点击多选框按钮时,Checkbutton
的状态会发生翻转(切换),在选中和不选中之间切换,常见于询问用户是否启用、打开某种选项。
创建一个 Checkbutton
对象
在我们买奶茶的时候,店主通常会询问是否加糖、是否加珍珠、是否加果粒等等,此时就是 Checkbutton
发挥作用的最好时机。
示例代码如下:
from tkinter import *
from tkinter import ttk
root = Tk()
main = ttk.Frame(root)
var_sugar = StringVar()
var_pearl = StringVar()
var_fruit = StringVar()
check_sugar=ttk.Checkbutton(main,text="加糖",variable=var_sugar,onvalue="加",offvalue="不加")
check_pearl= ttk.Checkbutton(main,text="加珍珠",variable=var_pearl,onvalue="加",offvalue="不加")
check_fruit=ttk.Checkbutton(main,text="加果粒",variable=var_fruit,onvalue="加",offvalue="不加")
main.grid()
check_sugar.grid(column=0,row=0)
check_pearl.grid(column=0,row=1)
check_fruit.grid(column=0,row=2)
root.mainloop()
以上代码创建了一个用于询问是否在奶茶里添加额外物品的界面,如下图所示:
作为一个成年人,当然是我全都要:
Checkbutton
多选框的值
上个代码示例,我们使用 onvalue
和 offvalue
指定了每个 Checkbutton
的选中值和不选中值。
实际上,Checkbutton
在不手动指定各个状态值的情况下,有一个默认值,选中为 1
,不选中为 0
。
Checkbutton
不会初始化链接的变量,所以需要设定链接变量的初始值!!
from tkinter import *
from tkinter import ttk
root = Tk()
main = ttk.Frame(root)
var_sugar = StringVar() # 不设定值
var_pearl = StringVar()
var_pearl.set("加")
var_fruit = StringVar()
var_fruit.set("不加")
check_sugar=ttk.Checkbutton(main,text="加糖",variable=var_sugar,onvalue="yes",offvalue="no")
check_pearl= ttk.Checkbutton(main,text="加珍珠",variable=var_pearl,onvalue="加",offvalue="不加")
check_fruit=ttk.Checkbutton(main,text="加果粒",variable=var_fruit,onvalue="加",offvalue="不加")
l_sugar = ttk.Label(main,textvariable=var_sugar)
l_pearl = ttk.Label(main,textvariable=var_pearl)
l_fruit = ttk.Label(main,textvariable=var_fruit)
main.grid()
check_sugar.grid(column=0,row=0)
check_pearl.grid(column=0,row=1)
check_fruit.grid(column=0,row=2)
l_sugar.grid(column=1,row=0)
l_pearl.grid(column=1,row=1)
l_fruit.grid(column=1,row=2)
root.mainloop()
执行结果如下:
以上代码 var_sugar
在程序启动之初,并没有被初始化,因此,我们在使用 Checkbutton
时要初始化链接变量的值。
Checkbutton
事件绑定
使用 command
参数可以为 Checkbutton
对象绑定对应的事件,每当其状态发生改变时都会触发该事件。
示例代码如下:
from tkinter import *
from tkinter import ttk
def click():
check['text']=var_sugar.get()
root = Tk()
main = ttk.Frame(root)
var_sugar = StringVar()
check=ttk.Checkbutton(main,text="点击事件",variable=var_sugar,onvalue="yes",offvalue="no",command=click)
main.grid()
check.grid(column=0,row=0)
root.mainloop()
当我们点击 Checkbutton
改变其状态时,让其文本发生对应的变化,效果如下:
突然有个大胆的想法!!
如果我们创建两个 Checkbutton
,当其中一个状态发生改变时,就改变另外一个的状态,形成一个循环!!!
代码如下:
from tkinter import *
from tkinter import ttk
def cmd1():
print(1)
if v2.get()=="选中":
v2.set('没选中')
else:
v2.set("选中")
def cmd2():
print(2)
if v1.get()=="选中":
v1.set('没选中')
else:
v1.set("选中")
root = Tk()
main = ttk.Frame(root)
v1 = StringVar()
v1.set("没选中")
v2 = StringVar()
v2.set("没选中")
c1 = ttk.Checkbutton(main,text="选择一",variable=v1,onvalue="选中",offvalue="没选中",command=cmd1)
c2 = ttk.Checkbutton(main,text="选择二",variable=v2,onvalue="选中",offvalue="没选中",command=cmd2)
main.grid()
c1.grid(column=0,row=0)
c2.grid(column=0,row=1)
root.mainloop()
执行效果如下:
由此可见
command
并不是以Checkbutton
的状态改变作为触发事件的,应该是点击事件触发的。
在以上案例中,链接值的改变并不会触发command
!!