##Checkbutton
※Checkbutton:Checkbutton 就是我们常见的多选框按钮
(下面写一个"翻牌子"的程序来举例)
先来测试一下 Checkbutton ,来感受一下 它的用法
from tkinter import *
root = Tk()
v = IntVar()
c = Checkbutton(root,text="测试一下",variable = v)
c.pack()
mainloop()
(解析:首先还是先实例化一个root顶层窗口,然后v = IntVar()这里需要用到一个Tkinter变量,用于表示这个按钮是否被选中,作为一个反馈,接着实例化Checkbutton,第一个参数即把这个按钮放到root窗口中,第二个参数为按钮的内容,第三个参数就是设置variable参数等于v那个变量,等等后边用来反馈按钮是否被选中)
为了更直观地看到选中和未选中时 v 的表现状态,我们可以把它显示出来,显示在 Label 标签里边。
开始写翻牌程序
from tkinter import *
root = Tk()
GIRLS = ["戴安娜","九尾狐妖","卡特","辛德拉"]
v = []
for girl in GIRLS:
v.append(IntVar())
b = Checkbutton(root,text = girl,variable = v[-1])
b.pack()
mainloop()
(解析:同样的先初始化了一个root窗口,然后这里使用循环的话会让我们的代码显得更加简洁,所以先来个GIRLS列表,接着再来一个变量v,我们每个按钮就需要一个存放变量的,所以还是给个列表,等等可以用循环来添加,然后在循环里边,每次都要一个Tkinter的变量用于存放每个按钮的状态,就可以把它追加到列表中去,接着实例化Checkbutton按钮,第三个参数因为每次都要拿到他最后的一个元素,所以是-1)
可以看到按钮的选项不太整齐,我们通过设置 pack 的 anchor 选项来制定显示位置的。
(anchor就是可以控制文本(或图像)在 Button 中显示的位置,他的参数值有9中设置方法:“n”, “ne”, “e”, “se”, “s”, “sw”, “w”, “nw”,“center” ,他们都是东南西北的缩写ewsn 分别代表东西南北,然后这里弄个左对齐就可以了,注意写的时候要大写)
##Radiobutton
※Radiobutton: Radiobutton 就是单选框按钮
(Radiobutton 的用法和 Checkbutton 的用法基本一致,唯一不同的就是 Radiobutton 要实现单选的效果,那么要实现这种互斥的效果,就是需要同一组内所有的 Radiobutton 只能共享一个 variable 选项,并且需要设置不同的 value 选项的值。)
from tkinter import *
root = Tk()
v = IntVar()
Radiobutton(root,text = "One",variable = v,value=1).pack(anchor =W)
Radiobutton(root,text = "Two",variable = v,value=2).pack(anchor =W)
Radiobutton(root,text = "Three",variable = v,value=3).pack(anchor =W)
mainloop()
(解析:一样的,先来个root窗口,然后上面说了多个按钮只需要一个变量,所以v = IntVar()就不用列表了,然后实例化出三个Radiobutt,然后第三个参数他们的variable的值都等于v,共享一个,接着后面要有value,而且他们的值不可以相同,在pick里面在设置一下左对齐。
然后上面有两次需要注意的,variable只能设置为同样一个变量,设置为v,然后value的值一定要不同才能实现互斥,
这个原理其实就是,每一次点中一个,比如点中了Two,那么他会把按钮的值即value =2赋给了v,给了这个v就说明他点中了,和其他两个一对比,上面的variable的值不少,下面的variable的值不是3,所以呢他们两个就不显示,v是等于2,和value=2是匹配的,这样就实现了互斥,单点了
如果上面那个value也是2的话,那么问题就来了,只要点One和Two其中一个,两个就会同时显示)
如果有多个选项的话,我们仍然可以使用循环,使得代码更加简洁:
from tkinter import *
root = Tk()
LANGS = [
("Python",1),
("Perl",2),
("Ruby",3),
("Lua",4)]
v = IntVar()
v.set(1)
for lang, num in LANGS:
b = Radiobutton(root,text=lang,variable=v,value=num)
b.pack(anchor = W)
mainloop()
※ 我们可以通过在Radiobutton的参数里设置:indicatoron = False,indicatoron 就是指示器,就是前面的小圆圈,设置为False就可以去掉小圈圈,变成按钮的形式
但是这样不太美观,我们可以在pack里设置fill=X就是横向填充按钮,如果设置fill=Y就是纵向填充。
##LabelFrame
※LavelFrame:标签框架,这实际上是 Frame 框架的进化版,从形态上来说,也就是添加了 Label 的 Frame,但是有了它,Checkbutton 和 Radiobutton 的分组就变得简单了。
比如现在想把刚才代码的四个组件给放到一个Frame里边去:
from tkinter import *
root = Tk()
group = LabelFrame(root,text="最好的脚本语言是?",padx = 5,pady=5)
group.pack(padx=10,pady =10)
LANGS = [
("Python",1),
("Perl",2),
("Ruby",3),
("Lua",4)]
v = IntVar()
for lang, num in LANGS:
b = Radiobutton(group,text=lang,variable=v,value=num)
b.pack(anchor =W)
mainloop()