首页 > Python基础教程 > Tkinter
阅读:4,477
Python Tkinter Radiobutton和Checkbutton控件用法
Radiobutton 组件代表单选钮,该组件可以绑定一个方法或函数,当单选钮被选择时,该方法或函数将会被触发。
为了将多个 Radiobutton 编为一组,程序需要将多个 Radiobutton 绑定到同一个变量,当这组 Radiobutton 的其中一个单选钮被选中时,该变量会随之改变;反过来,当该变量发生改变时,这组 Radiobutton 也会自动选中该变量值所对应的单选钮。
下面程序示范了 Radiobutton 组件的用法:
运行上面程序,可以看到程序默认选中第二个单选钮,这是因为第二个单选钮的 value 为 2,而程序将这组单选钮绑定的 self.intVar 的值设置为 2;如果用户改变选中其他单选钮,程序将会弹出提示框显示用户的选择项,如图 1 所示:

图 1 选中不同的单选钮
单边钮除了可以显示文本,也可以显示图片,只要为其指定 image 选项即可。如果希望图片和文字同时显示也是可以的,只要通过 compound 边项进行控制即可(如果不指定 compound 选项,该选项默认为 None,这意味着只显示图片)。如下程序示范了带图片的单选钮:

图 2 带图标的单选钮
上面程序还重新设置了窗口图标,因此在运行界面上可以看到窗口图标是自定义的图标。
Checkbutton 与 Radiobutton 很相似,只是 Checkbutton 允许选择多项,而每组 Radiobutton 只能选择一项。其他功能基本相似,同样可以显示文字和图片,同样可以绑定变量,同样可以为选中事件绑定处理函数和处理方法。但由于 Checkbutton 可以同时选中多项,因此程序需要为每个 Checkbutton 都绑定一个变量。
Checkbutton 就像开关一样,它支持两个值:开关打开的值和开关关闭的值。因此,在创建 Checkbutton 时可同时设置 onvalue 和 offvalue 选项为打开和关闭分别指定值。如果不指定 onvalue 和 offvalue,则 onvalue 默认为 1,offvalue 默认为 0。
下面程序通过两组 Checkbutton 示范了 Checkbutton 的用法:
运行该程序,选中“Java入门教程”选项,可以看到如图 3 所示的运行效果。

图 3 Checkbutton 组件
为了将多个 Radiobutton 编为一组,程序需要将多个 Radiobutton 绑定到同一个变量,当这组 Radiobutton 的其中一个单选钮被选中时,该变量会随之改变;反过来,当该变量发生改变时,这组 Radiobutton 也会自动选中该变量值所对应的单选钮。
下面程序示范了 Radiobutton 组件的用法:
from tkinter import *
# 导入ttk
from tkinter import ttk
class App:
def __init__(self, master):
self.master = master
self.initWidgets()
def initWidgets(self):
# 创建一个Label组件
ttk.Label(self.master, text='选择您喜欢的教程:')\
.pack(fill=BOTH, expand=YES)
self.intVar = IntVar()
# 定义元组
books = ('C语言入门', 'Python入门',
'C++入门', 'Java入门')
i = 1
# 采用循环创建多个Radiobutton
for book in books:
ttk.Radiobutton(self.master,
text = book,
variable = self.intVar, # 将Radiobutton绑定到self.intVar变量
command = self.change, # 将选中事件绑定到self.change方法
value=i).pack(anchor=W)
i += 1
# 设置Radiobutton绑定的变量的值为2,
# 则选中value为2的Radiobutton
self.intVar.set(2)
def change(self):
from tkinter import messagebox
# 通过Radiobutton绑定变量获取选中的单选框
messagebox.showinfo(title=None, message=self.intVar.get() )
root = Tk()
root.title("Radiobutton测试")
App(root)
root.mainloop()
上面程序使用循环创建了多个 Radiobutton 组件,程序指定将这些 Radiobutton 绑定到 self.intVar 变量,这意味着这些 Radiobutton 位于同一组内;与此同时,程序为这组 Radiobutton 的选中事件绑定了 self.change 方法,因此每次当用户选择不同的单选钮时,总会触发该对象的 change() 方法。运行上面程序,可以看到程序默认选中第二个单选钮,这是因为第二个单选钮的 value 为 2,而程序将这组单选钮绑定的 self.intVar 的值设置为 2;如果用户改变选中其他单选钮,程序将会弹出提示框显示用户的选择项,如图 1 所示:

图 1 选中不同的单选钮
单边钮除了可以显示文本,也可以显示图片,只要为其指定 image 选项即可。如果希望图片和文字同时显示也是可以的,只要通过 compound 边项进行控制即可(如果不指定 compound 选项,该选项默认为 None,这意味着只显示图片)。如下程序示范了带图片的单选钮:
from tkinter import *
# 导入ttk
from tkinter import ttk
class App:
def __init__(self, master):
self.master = master
self.initWidgets()
def initWidgets(self):
# 创建一个Label组件
ttk.Label(self.master, text='选择您喜欢的兵种:')\
.pack(fill=BOTH, expand=YES)
self.intVar = IntVar()
# 定义元组
races = ('z.png', 'p.png','t.png')
raceNames = ('虫族', '神族','人族')
i = 1
# 采用循环创建多个Radiobutton
for rc in races:
bm = PhotoImage(file = 'images/' + rc)
r = ttk.Radiobutton(self.master,
image = bm,
text = raceNames[i - 1],
compound = RIGHT, # 图片在文字右边
variable = self.intVar, # 将Radiobutton绑定到self.intVar变量
command = self.change, # 将选中事件绑定到self.change方法
value=i)
r.bm = bm
r.pack(anchor=W)
i += 1
# 设置默认选中value为2的单选按钮
self.intVar.set(2)
def change(self): pass
root = Tk()
root.title("Radiobutton测试")
# 改变窗口图标
root.iconbitmap('images/fklogo.ico')
App(root)
root.mainloop()
上面程序为 RadioButton 同时指定了 image 和 text 选项,并指定 compound 选项为 RIGHT,这意味着该单选钮的图片显示在文字的右边。运行上面程序,可以看到如图 2 所示的运行界面。

图 2 带图标的单选钮
上面程序还重新设置了窗口图标,因此在运行界面上可以看到窗口图标是自定义的图标。
Checkbutton 与 Radiobutton 很相似,只是 Checkbutton 允许选择多项,而每组 Radiobutton 只能选择一项。其他功能基本相似,同样可以显示文字和图片,同样可以绑定变量,同样可以为选中事件绑定处理函数和处理方法。但由于 Checkbutton 可以同时选中多项,因此程序需要为每个 Checkbutton 都绑定一个变量。
Checkbutton 就像开关一样,它支持两个值:开关打开的值和开关关闭的值。因此,在创建 Checkbutton 时可同时设置 onvalue 和 offvalue 选项为打开和关闭分别指定值。如果不指定 onvalue 和 offvalue,则 onvalue 默认为 1,offvalue 默认为 0。
下面程序通过两组 Checkbutton 示范了 Checkbutton 的用法:
from tkinter import *
# 导入ttk
from tkinter import ttk
from tkinter import messagebox
class App:
def __init__(self, master):
self.master = master
self.initWidgets()
def initWidgets(self):
# 创建一个Label组件
ttk.Label(self.master, text='选择您喜欢的人物:')\
.pack(fill=BOTH, expand=YES)
self.chars = []
# 定义元组
characters = ('孙悟空', '猪八戒','唐僧', '牛魔王')
# 采用循环创建多个Checkbutton
for ch in characters:
intVar = IntVar()
self.chars.append(intVar)
cb = ttk.Checkbutton(self.master,
text = ch,
variable = intVar, # 将Checkbutton绑定到intVar变量
command = self.change) # 将选中事件绑定到self.change方法
cb.pack(anchor=W)
# 创建一个Label组件
ttk.Label(self.master, text='选择您喜欢的教程:')\
.pack(fill=BOTH, expand=YES)
# --------------下面是第二组Checkbutton---------------
self.books = []
# 定义两个元组
books = ('C语言基础教程', 'C++入门教程','Java入门教程', 'Linux教程')
vals = ('C', 'C++','Java', 'Linux')
i = 0
# 采用循环创建多个Checkbutton
for book in books:
strVar = StringVar()
self.books.append(strVar)
cb = ttk.Checkbutton(self.master,
text = book,
variable = strVar, # 将Checkbutton绑定到strVar变量
onvalue = vals[i],
offvalue = '无',
command = self.books_change) # 将选中事件绑定到books_change方法
cb.pack(anchor=W)
i += 1
def change(self):
# 将self.chars列表转换成元素为str的列表
new_li = [str(e.get()) for e in self.chars]
# 将new_li列表连接成字符串
st = ', '.join(new_li)
messagebox.showinfo(title=None, message=st)
def books_change(self):
# 将self.books列表转换成元素为str的列表
new_li = [e.get() for e in self.books]
# 将new_li列表连接成字符串
st = ', '.join(new_li)
messagebox.showinfo(title=None, message=st)
root = Tk()
root.title("Checkbutton测试")
# 改变窗口图标
root.iconbitmap('favicon.ico')
App(root)
root.mainloop()
上面程序中第一组 Checkbutton 没有指定 onvalue 和 offvalue,因此它们的 onvalue 和 offvalue 默认分别为 1、0,所以程序将这组 Checkbutton 绑定到 IntVar 类型的变量;第二组 Checkbutton 将 onvalue 和 offvalue 都指定为字符串,因此程序将这组 Checkbutton 绑定到 StringVar 类型的变量。运行该程序,选中“Java入门教程”选项,可以看到如图 3 所示的运行效果。

图 3 Checkbutton 组件
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频