今天我们一起来学习三个组件:Checkbutton、Radiobutton 和 LabelFrame。
同样,我们还是通过案例来讲解。
一、Checkbutton
Checkbutton(多选框)。大家都知道什么叫做“翻牌子”,今天的第一个例子就是来写一个翻牌子的程序。
Checkbutton 就是我们常见的多选框按钮,而 下面要讲的 Radiobutton 就是单选框按钮。那大家觉得 翻牌子 程序应该是使用 Checkbutton 还是 Radiobutton 来实现呢?我个人认为哈,应该是 Checkbutton 。
我们首先来测试一下 Checkbutton ,来感受一下 它的用法:
-
import tkinter as tk
-
root = tk.Tk()
-
v = tk.IntVar() #设置一个tk 变量用于表示按钮是否被选中,这里用整型变量 IntVar
-
c = tk.Checkbutton(root, text= "测试一下", variable = v)
-
c.pack()
-
root.mainloop
运行结果如下:
没有按按钮时: -> 点下按钮的时候:->
当我们点下按钮的时候,这个框框里会出现一个小勾,为了更直观的让大家知道选中和未选中时 v 的表现状态,我们可以把它显示出来,显示在 Label 标签里面。
-
import tkinter as tk
-
root = tk.Tk()
-
v = tk.IntVar() #设置一个tk 变量用于表示按钮是否被选中,这里用整型变量 IntVar
-
c = tk.Checkbutton(root, text= "测试一下", variable = v)
-
c.pack()
-
l = tk.Label(root, textvariable = v)
-
l.pack()
-
root.mainloop
运行结果如下:
没有选中时: -> 选中的时候:->
有了这样的基础,我们就可以来写我们的翻牌子程序了。
-
import tkinter as tk
-
root = tk.Tk()
-
GIRLS = ["西施", "貂蝉", "王昭君", "杨玉环"]
-
v = []
-
for girl in GIRLS:
-
v.append(tk.IntVar())
-
b = tk.Checkbutton(root, text = girl, variable = v[-1])
-
b.pack()
-
root.mainloop
运行结果如下:
我们希望把所有的 Checkbotton 左对齐:
通过设置 pack 的 anchor 选项,就可以实现了。 anchor 选项 是用于制定显示位置的。
anchor 用法:
1. 控制文本(或图像)在 Button 中显示的位置
2. "n", "ne", "e", "se", "s", "sw", "w", "nw", 或者 "center" 来定位(ewsn 代表东西南北,上北下南左西右东)
3. 默认值是 "center"
b.pack(anchor = "w")
二、Radiobutton
Radiobutton(单选框),Radiobutton 的用法和 Checkbutton 的用法基本一致,唯一不同的就是 Radiobutton 要实现单选的效果,就是需要同一组内所有的 Radiobutton 只能共享一个 variable 选项,并且需要设置不同的 value 选项的值。
我们通过代码来讲解:
-
import tkinter as tk
-
root = tk.Tk()
-
v = tk.IntVar()
-
tk.Radiobutton(root, text = "One", variable = v, value = 1).pack(anchor = "w")
-
tk.Radiobutton(root, text = "Two", variable = v, value = 2).pack(anchor = "w")
-
tk.Radiobutton(root, text = "Three", variable = v, value = 3).pack(anchor = "w")
-
root.mainloop()
运行结果如下:
这里有两点需要注意的:
1、variable 选项只能设置为同一个变量,这里都是 v;
2、value 选项的值 一定要不同,才能实现互测。
Radiobutton 的原理就是:你每一次点中一个按钮,它就会把这个按钮的 value 给 v,然后根据 v 的值来选中对应的框。
同样的,如果你有多个选项的话,我们仍然可以使用循环,使得代码更加简洁:
-
import tkinter as tk
-
root = tk.Tk()
-
LANGS = [
-
("Python", 1),
-
("Perl", 2),
-
("Ruby", 3),
-
("Lua", 4),
-
("C++", 5)]
-
v = tk.IntVar()
-
v.set(1)
-
for lang, num in LANGS:
-
b = tk.Radiobutton(root, text = lang, variable = v, value = num)
-
b.pack(anchor = "w")
-
root.mainloop()
运行结果如下:
有人要提意见了:“我不喜欢前面的小圆圈,我有圆形恐惧症!”
没问题,我们只需要加一个选项 indicatoron = False。(indicatoron 就是指示器,就是前面的小圆圈,把它设置为 False,就不会显示了。)
-
b = tk.Radiobutton(root, text = lang, variable = v, value = num, indicatoron = False)
-
b.pack(anchor = "w")
如下:
这样不美观,我们可以横向填充按钮。
-
b = tk.Radiobutton(root, text = lang, variable = v, value = num, indicatoron = False)
-
b.pack(fill = "x")
三、LabelFrame
LabelFrame(标签框架),这实际上是 Frame 框架的进化版,从形态上来说,也就是添加了 Label 的 Frame,但是有了它,Checkbutton 和 Radiobutton 的分组就变得简单了。
-
import tkinter as tk
-
root = tk.Tk()
-
group = tk.LabelFrame(root, text = "最好的脚本语言是:", padx = 5, pady =5)
-
group.pack(padx = 10, pady = 10)
-
LANGS = [
-
("Python", 1),
-
("Perl", 2),
-
("Ruby", 3),
-
("Lua", 4),
-
("C++", 5)]
-
v = tk.IntVar()
-
for lang, num in LANGS:
-
b = tk.Radiobutton(group, text = lang, variable = v, value = num)
-
b.pack(anchor = "w")
-
root.mainloop()
运行结果如下: