第8章 单选按钮控件(Radiobutton)
Radiobutton,可以叫做单选按钮,无线按钮或者勾选按钮。单选按钮的功能是是实现多选一,从多个待选项中选择一个。 单选按钮的提示信息可以是文字或者图像,单选按钮的外观也有多种样式。为了能够更加灵活的处理单选按钮,还可以绑定一个回调函数,用来处理复杂的情况。当单选按钮被点击的时候,系统会自动调用这个函数。
单选按钮的文字只能使用一种字体。如果提示的文本信息太长,可以折行显示。还可以对其中的一个字符设置下划线,用来表示快捷键。默认情况下,可以使用Tab键移动焦点到单选按钮控件上。
每一组单选按钮只能和同一个变量关联。每个选项代表这个变量可能取值中的一个。这些取值不能重复,重复的单选按钮也没有任何的意义。
8.1 单选按钮控件属性

选项描述
activebackground当鼠标左键按下时,单选按钮的背景色
activeforeground当鼠标左键按下时,单选按钮的前景色(文字颜色)
anchor控制文本或者图片如何摆放。可以使用的数值有:
N, NE, E, SE, S, SW, W, NW, CENTER. 默认值是CENTER
backgroud
bg
单选按钮的背景色
bitmap背景图片
borderwidth
bd
边框的大小,默认为 2 个像素
command回调函数,当单选按钮被点击时,执行该函数
compound设置如何同时显示文字和图片。默认的模式是如果提供了图片,会只显示图片。但是,如果将选项设为:
CENTER:在图片中央叠加显示文字
BOTTOM:在图片下方显示文字
LEFT:在图片左边显示文字
RIGHT:在图片右边显示文字
TOP:在图片上方显示文字
NONE:不显示文字
cursor光标的形状设定,如arrow, circle, cross, plus 等
disabledforeground禁用单选按钮时的前景色(文本颜色)
font文本字体
foreground
fg
单选按钮的前景色(文本颜色)
height设置高度。单位是行
highlightcolor获得输入焦点时的高亮颜色(无效果)
highlightbackground失去输入焦点时的背景颜色(无效果)
highlightthickness获得输入焦点时的高亮边框宽度
indicatoron控制indicator的状态。默认是True。如果是False,则不会显示圆形按钮,会用不同按钮的形式来显示整组的按钮,选中的按钮和其他未选中的靠按钮效果来区分。一般情况下,选中的按钮是SUNKEN效果的,而未选中的是RAISED效果的。
image背景图片。
justify折行显示的时候,设置不同行之间的对齐方式,可选项包括LEFT, RIGHT, CENTER
offrelief按钮状态为off时的显示效果。默认值是RAISED
overrelief鼠标经过单选按钮时候的显示效果。
padx按钮在x轴方向上的内边距(padding),默认为 1 像素。
pady按钮在y轴方向上的内边距(padding),默认为 1 像素。
relief显示效果,设置控件的3D效果,可选的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。默认为 FLAT。
selectcolor圆形按钮的背景颜色
selectimage单选按钮被选中后显示的图片
state单选按钮状态,默认为 state=NORMAL
text提示文本,可使用 “\n” 来对文本进行换行。
takefocus表示可以使用Tab键移动焦点到该单选按钮。默认是可以。
textvariable关联的tkinter变量,一般是StringVar类型。如果该变量改变,则这个单选按钮的文本会更新。
underline定义在那个字符下面显示下划线。默认按钮上的文本都不带下划线。
variable变量,variable 的值为 1 或 0,代表着选中或不选中
width默认宽度是单选按钮的文本或图像决定的,可以设置指定字符数。
wraplength决定单选按钮的文字是否可以折行显示
8.1.1 activebackground和activeforeground
activebackground是鼠标左键按下时,单选按钮的背景颜色,鼠标键释放后,恢复初始颜色。activeforeground是鼠标左键按下时,单选按钮的文本颜色,鼠标键释放后,恢复初始颜色。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')

b1 = tk.Radiobutton(root,text='选择1',activebackground='red',activeforeground='yellow')
b1.pack()

root.mainloop()

结果:
在这里插入图片描述
在这里插入图片描述
8.1.2 anchor
设置如何显示文本或者图像提示信息。可选项有:N, NE, E, SE, S, SW, W, NW, CENTER。如果是使用字符串直接赋值,需要小写字母。比如anchor=’ne’。
anchor属性如果要起作用,在使用pack布局管理器,需要设置expand=True以及fill=X、fill=Y或者fill=BOTH。否则anchor很可能没有效果。
如果使用grid布局管理器,需要设置rowconfigure和columnconfigure,同时设置sticky=’nsew’。详细的见代码说明。
pack布局管理代码:

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')

b1 = tk.Radiobutton(root,text='选择1',anchor=tk.S+tk.W)
b1.pack(fill=tk.BOTH,expand=True)
root.mainloop()

结果:
在这里插入图片描述
说明:fill=tk.BOTH和expand=True的作用是让子控件可以充满整个窗口。
grid布局管理代码:

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
b1 = tk.Radiobutton(root,text='选择1',anchor=tk.S+tk.W)
b1.grid(row=0,column=0,sticky='nsew')
root.mainloop()

结果:
在这里插入图片描述
说明:root.rowconfigure(0, weight=1)和root.columnconfigure(0, weight=1)是让单元格可以充满整个窗口。b1.grid(row=0,column=0,sticky=‘nsew’)是让单元格在左下角。实际上起作用的是sticky,而不是anchor。
tkinter提供了多种的对齐方式,有的需要组合才能实现控件在指定的位置出现。这是tkinter的弱势之一,另外一个弱势是速度有点慢。
8.1.3 background(bg)
background的属性是设置单选按钮的背景颜色。bg是缩写格式。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
b1 = tk.Radiobutton(root,text='红色',bg='red',
                    variable=color,value=0)
b1.pack()
b2 = tk.Radiobutton(root,text='蓝色',bg='blue',
                    variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2)
b3.pack()
root.mainloop()

结果:
在这里插入图片描述
8.1.4 foreground(fg)
设置单选按钮文本的颜色。fg是缩写格式。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
b1 = tk.Radiobutton(root,text='红色',fg='red',
                    variable=color,value=0)
b1.pack()
b2 = tk.Radiobutton(root,text='蓝色',fg='blue',
                    variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',fg='green',
                    variable=color,value=2)
b3.pack()
root.mainloop()

结果:
在这里插入图片描述
8.1.5 font
设置文本的字体。跟前面的章节设置方法是一样的,只能设置一种字体。详细说明见3.3.3节

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
b1 = tk.Radiobutton(root,text='红色',fg='red',
                    font=('times',20,'bold'))
b1.pack()
root.mainloop()

结果:
在这里插入图片描述
8.1.6 bitmap
用一种早期的图像格式来显示提示信息,已经被image取代。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')

color=tk.IntVar()
b1 = tk.Radiobutton(root,bitmap='error')
b1.pack()
root.mainloop()

结果:
在这里插入图片描述
8.1.7 borderwidth(bd)
设置边框的宽度。默认的边框是1或者2,单位是像素。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')

color=tk.IntVar()
b1 = tk.Radiobutton(root,text='边框',bd=20)
b1.pack()

root.mainloop()

结果:
在这里插入图片描述
在这里插入图片描述
图一是没有设置边框的情况,使用的默认值是2。图二是设置边框为20,可以看见单选按钮明显下移。多出来的就是边框的宽度。
8.1.8 state 和disabledforeground
state是设置单选按钮的状态。一共有三种:NORMAL、ACTIVE和DISABLED。NORMAL和ACTIVE状态下,单选按钮都可以正常使用。DISABLED状态下,单选按钮不能使用或者选择。而disabledforeground是设置在DISABLED状态下单选按钮的提示文字颜色的,也就是说,在单选按钮被禁止使用的情况下,可以通过这个属性来提示用户。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
b1 = tk.Radiobutton(root,text='选择1',state='disabled',
                    disabledforeground='red')
b1.pack()
root.mainloop()

结果:
在这里插入图片描述
说明:在state=’disabled’的时候,设置disabledforeground可以改变提示文本的颜色。
8.1.9 highlightcolor、highlightbackground和highlightthickness
这三个属性是处理单选按钮获得与失去输入焦点时候的边框的背景颜色、高亮颜色以及边框的宽度。不过highlightcolor和highlightbackground在单选按钮中不起作用。highlightthickness是有效果的,可以增加边框的宽度。
8.1.10 selectcolor
单选按钮的指示符背景色。默认是白色的。可以通过设置此选项设置指示符的颜色。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
b1 = tk.Radiobutton(root,text='红色',bg='red',
                    variable=color,value=0,
                    selectcolor='yellow')
b1.pack()
b2 = tk.Radiobutton(root,text='蓝色',bg='blue',
                    variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2)
b3.pack()
root.mainloop()

结果:
在这里插入图片描述
8.1.11 image和selectimage
image是用图像来代替文本作为提示信息。selectimage用来显示当单选按钮被选中时的图片。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
aimage=tk.PhotoImage(file='a.gif')
bimage=tk.PhotoImage(file='b.gif')
b1 = tk.Radiobutton(root,image=aimage,bg='red',
                    variable=color,value=0,
                    selectimage=bimage)
b1.pack()
b2 = tk.Radiobutton(root,text='蓝色',bg='blue',
                    variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2)
b3.pack()
root.mainloop()

结果:
在这里插入图片描述
在这里插入图片描述
8.1.12 cursor
鼠标经过单选按钮时的形状,详细的说明见3.3.6节。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
b1 = tk.Radiobutton(root,text='红色',bg='red',
                    variable=color,value=0,
                    cursor='spider')
b1.pack()
b2 = tk.Radiobutton(root,text='蓝色',bg='blue',
                    variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2)
b3.pack()
root.mainloop()

结果:
在这里插入图片描述
说明:cursor只对一个单选按钮起作用,对同组的其他单选按钮,没有效果。
8.1.13 overrelief 和 relief
relief是设置单选按钮的显示效果。overrelief是在鼠标经过时单选按钮时的显示效果。关于relief的说明见3.3.5节

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1 = tk.Radiobutton(root,bg='red',text='红色',
                    relief='flat',bd=5)
b1.pack()
b2 = tk.Radiobutton(root,text='蓝色',bg='blue',
                    relief='flat',
                    overrelief='groove',bd=5)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    relief='flat',bd=5)
b3.pack()
root.mainloop()

结果:
在这里插入图片描述
说明:1. 正常的显示是’flat’,由relief设定。
当鼠标经过单选按钮区域时,外观会发生变化。比如示例中就显示为GROOVE的效果。这个属性由overrelief设置。
8.1.14 indicatoron 和 offrelief
正常的情况下,使用单选按钮都是有指示符的,就是在提示文字前面的圆形按钮。不过也可以不用这个指示符,而使用按压式按钮的形式。就是按钮被按下表示被选中,按钮弹起表示没有被选中。默认情况下,indicatoron是False,表示使用指示符。如果设为True,就不使用指示符。
在不使用指示符的情况下,可以通过设定offrelief来设置按钮没有被选中时候的效果,此时上一节介绍的relief就没有作用了。
为了突出显示效果,最好把边框值设定的大一些。默认值是2,建议设置bd>5。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
b1 = tk.Radiobutton(root,text='红色',bg='red',bd=5,
                    indicatoron=False,variable=color,
                    value=0,offrelief='groove',relief='flat')
b1.pack()
b2 = tk.Radiobutton(root,text='蓝色',bg='blue',bd=5,
                    indicatoron=False,variable=color,
                    value=1,offrelief='groove',relief='flat')
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',bd=5,
                    indicatoron=False,variable=color,value=2,
                    offrelief='groove',relief='flat')
b3.pack()
root.mainloop()

结果:
在这里插入图片描述
说明:1. indicatoron=False时,单选按钮没有通常的指示符。offrelief的设置起作用,而relief则没有效果了。offrelief=’groove’而relief=’flat’,可以看到最终的效果是GROOVE。
8.1.15 padx和pady
padx和pady是分别定义白在水平和垂直方向上的内边距。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
b1 = tk.Radiobutton(root,padx=10,pady=15,bg='red',
                    text='红色',variable=color,value=0,)
b1.pack()
b2 = tk.Radiobutton(root,text='蓝色',bg='blue',
                    variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2)
b3.pack()
root.mainloop()

结果:
在这里插入图片描述
8.1.16 compound
compound设置如何在使用图片作为提示信息的时候叠加文字的方法。有5个选项:
LEFT,RIGHT,TOP,BOTTOM,CENTER
如果没有设置compound是无法同时显示文字和图片的。显示的优先级是image > bitmap >text

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
a=tk.PhotoImage(file='a.gif')
b1 = tk.Radiobutton(root,image=a,compound=tk.TOP,
                    bg='red',text='红色',
                    variable=color,value=0,)
b1.pack()
b2 = tk.Radiobutton(root,text='蓝色',bg='blue',
                    variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2)
b3.pack()
root.mainloop()

结果:
在这里插入图片描述
8.1.17 height 和width
分别设置单选按钮的长度和宽度。width的单位是字符,height的单位是行。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
b1 = tk.Radiobutton(root,height=2,width=3,bg='red',
                    text='红色',variable=color,value=0,)
b1.pack()
b2 = tk.Radiobutton(root,text='蓝色',bg='blue',
                    variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2)
b3.pack()
root.mainloop()

结果:
在这里插入图片描述
8.1.18 takefocus
takefocus的作用是定义单选按钮是否可以使用Tab键获得输入焦点。默认情况下是可以。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
b1 = tk.Radiobutton(root,takefocus=0,height=2,
                    width=3,bg='red',text='红色',
                    variable=color,value=0,)
b1.pack()
b2 = tk.Radiobutton(root,takefocus=1,text='蓝色',
                    bg='blue',variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2)
b3.pack()
root.mainloop()

说明:
‘红色’的单选按钮是无法用Tab获得输入焦点的
‘蓝色’的单选按钮可以获得输入焦点,因为takefocus=1
‘绿色’的单选按钮也可以获得输入焦点,因为默认值是1。
8.1.19 text和textvariable
有两种方法设置单选按钮的提示文字。一种是使用text,另外一种是使用textvariable。这个属性不是单选按钮的取值,仅仅设置单选按钮的提示文字。
text属性是直接赋值就可以了。textvariable需要通过修改与textvariable关联的StringVar对象达到赋值提示文字的作用。
如何动态修改提示文字?也是有两种方法:
(1)radio[‘text’]=’提示文字’
(2)strvar.set(‘提示文字’)。strvar是一个StringVar对象,与textvariable相关联。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
strvar=tk.StringVar()
strvar.set('蓝色')
b1 = tk.Radiobutton(root,height=2,width=3,bg='red',
                    text='红色',variable=color,value=0,)
b1.pack()
b2 = tk.Radiobutton(root,textvariable=strvar,
                    bg='blue',variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2)
b3.pack()
root.mainloop()
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
strvar=tk.StringVar()
strvar.set('蓝色')
b1 = tk.Radiobutton(root,bg='red',text='红色',
                    variable=color,value=0,)
b1.pack()
b2 = tk.Radiobutton(root,textvariable=strvar,
                    bg='blue',variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2)
b3.pack()
def change_text():
    b1['text']='提示文字'
    strvar.set('提示文字')
    
b4=tk.Button(root,text='修改提示文字',command=change_text)
b4.pack()
root.mainloop()

结果:
在这里插入图片描述
在这里插入图片描述
说明:代码2中,如果点击’修改提示文字’按钮就会修改红色和蓝色的单选按钮的提示文字。
8.1.20 underline
在第几个提示文字下面标识下划线。0表示第一个字符,1,表示第二个字符,以此类推。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
strvar=tk.StringVar()
strvar.set('蓝色')
b1 = tk.Radiobutton(root,bg='red',underline=3,
                    text='红色的文字',
                    variable=color,value=0,)
b1.pack()
b2 = tk.Radiobutton(root,textvariable=strvar,
                    bg='blue',variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green'
                    ,variable=color,value=2)
b3.pack()
root.mainloop()

结果:
在这里插入图片描述
8.1.21 wraplength
设置折行显示。在没有规定width和height的情况下,控件会自动计算提示文字的大小并显示。但是在规定了width的情况下,如果提示文字过长,会有部分文字无法显示。这个时候,可以通过设置wraplength来折行显示。但是如果height的行数设置不够,还是会发生字符不能显示的情况。注意wraplength的单位是像素,而不是字符。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
strvar=tk.StringVar()
strvar.set('蓝色')
b1 = tk.Radiobutton(root,takefocus=0,height=5,
                    width=3,bg='red',underline=3,
                    text='红色的文字很长的文字',
                    variable=color,value=0,)
b1.pack()
b2 = tk.Radiobutton(root,takefocus=1,textvariable=strvar,
                    bg='blue',variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2)
b3.pack()
root.mainloop()
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
strvar=tk.StringVar()
strvar.set('蓝色')
b1 = tk.Radiobutton(root,bg='red',height=5,width=3,
                    wraplength=90,justify='left',
                    text='红色的文字很长的文字',
                    variable=color,value=0,)
b1.pack()
b2 = tk.Radiobutton(root,textvariable=strvar,bg='blue',
                    variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2)
b3.pack()
root.mainloop()
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
strvar=tk.StringVar()
strvar.set('蓝色')
b1 = tk.Radiobutton(root,bg='red',height=5,width=3,
                    wraplength=40,justify='left',
                    text='红色的文字很长的文字',
                    variable=color,value=0,)
b1.pack()
b2 = tk.Radiobutton(root,textvariable=strvar,bg='blue',
                    variable=color,value=1)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2)
b3.pack()
root.mainloop()

结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明:
代码1的情况就是单选按钮的width不够宽,因而无法显示全部的提示文字。
代码2的情况是设置了wraplength后,显示折行。但是由于width不够宽,还是不能显示全部的内容。
代码3的情况是显示了全部的文字。
8.1.21 justify
justify是在折行的情况下定义如何对齐,有三种方式:CENTER,LEFT和RIGHT。详细的说明见第四章。
8.1.22 command 和value、variable
command是定义单选按钮的回调函数。当触发该单选按钮时,会调用相应的函数。而value是定义单选按钮的取值。一般的情况下,会定义一个整形数给单选按钮。不过也可以定义其他的数值,比如字符串。variable是与一个变量相关联,可以获取单选按钮的取值。注意,同一组的多个单选按钮是使用同一个与variable相关联变量的。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.IntVar()
strvar=tk.StringVar()
b4=tk.Entry(root,textvariable=strvar)
def radio():
    strvar.set(color.get())
   
b1 = tk.Radiobutton(root,bg='red',text='红色',
                    variable=color,value=0,command=radio)
b1.pack()
b2 = tk.Radiobutton(root,text='蓝色',bg='blue',
                    variable=color,value=1,command=radio)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value=2,command=radio)
b3.pack()
b4.pack()  
root.mainloop()
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
color=tk.StringVar()
color.set('red')
strvar=tk.StringVar()
b4=tk.Entry(root,textvariable=strvar)
def radio():
    strvar.set(color.get())
b1 = tk.Radiobutton(root,bg='red',text='红色',
                    variable=color,value='red',
                    command=radio)
b1.pack()
b2 = tk.Radiobutton(root,text='蓝色',bg='blue',
                    variable=color,value='blue',
                    command=radio)
b2.pack()
b3 = tk.Radiobutton(root,text='绿色',bg='green',
                    variable=color,value='green',
                    command=radio)
b3.pack()
b4.pack()  
root.mainloop()

结果:
在这里插入图片描述
在这里插入图片描述
选中不同的单选按钮,就会在输入框中显示不同的值。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐