1.Radiobutton选项按钮
选项按钮的基本概念
在设计选项按钮时,最常见的方式是让选项按钮以文字方式存在,与标签一样我们也可以设计含图像的选项按钮。
程序设计时可以让选项按钮与函数(或方法)绑在一起,当选择适当的按钮时,可以自动执行相关的函数或方法。
另外,程序设计时可能会有多组选项按钮,此时可以设计一组选项按钮有一个相关的变量,用此变量绑定这组
选项按钮。
这时可以使用Radiobutton()方法建立上述系列选项按钮,语法格式如下:
Radiobutton(父对象,options,··)
Radiobutton()方法的第一个参数是父对象,表示这个选项按钮将建立在哪一个父对象内。下列是Radiobutton()
方法内其他常用的options参数。
(1)activebackground:鼠标光标在选项按钮上时的背景颜色。
(2)activeforeground:鼠标光标在选项按钮上时的前景颜色。
(3)anchor:如果空间大于所需时,控制选项按钮的位置,默认是CENTER。
(4)bg:标签背景或indicator的背景颜色。
(5)bitmap:位图图像对象。
(6)borderwidth或bd:边界宽度默认是两个像素。
(7)command:当用户更改选项时,会自动执行此函数。
(8)cursor:当鼠标光标在选项按钮上时的光标形状。
(9)fg:文字前景颜色。
(10)font:字形。
(11)height:选项按钮上的文字有几行,默认是1行。
(12)hightlightbackground:当选项按钮取得焦点时的背景颜色。
(13)hightlightcolor:当选项按钮取得焦点时的颜色。
(14)image:图像对象,如果要建立含图像的选项按钮时,可以使用此参数。
(15)indicatoron:当此值为0时,可以建立盒子选项按钮。
(16)justify:当含多行文字时,最后一行文字的对齐方式。
(17)padx:默认是1,可设置选项按钮与文字的间隔。
(18)pady:默认是1,可设置选项按钮的上下间距。
(19)selectcolor:当选项按钮被选取时的颜色。
(20)selectimage:如果设置图像选项按钮时,可由此设置当选项按钮被选取时的不同图像。
(21)state:默认是state=NORMAL,若是设置DISABLE则以灰阶显示选项按钮表示暂时无法使用。
(22)text:选项按钮旁的文字。
(23)textvariable:以变量方式显示选项按钮文字。
(24)underline:可以设置第几个文字有下画线,从0开始算起,默认是-1,表示无下画线。
(25)value:选项按钮的值,可以区分所选取的选项按钮。
(26)variable:设置或取得目前选取的单选项按钮,它的值类型通常是IntVar或StringVar。
(27)width:选项按钮的文字有几个字符宽,省略时会自行调整为实际宽度。
(28)wraplength:限制每行的文字数,默认是0,表示只有"\n"才会换行。
绑定整组选项按钮的方式如下。
var IntVar
rb1=Radiobutton(root,···,variable=var,value=x1,···)
rb2=Radiobutton(root,···,variable=var,value=x2,···)
···
rbn=Radiobutton(root,···,variable=var,value=x3,···)
未来若是想取得这组选项按钮所选的选项,可以使用get()方法,这时会将所选选项的参数value
的值传回,方法set()可以设置最初默认的value选项。
样例:程序刚执行时默认选项是"男生",此时窗口上方显示尚未选择,然后可以选择"男生"或"女生",
选择完成后可以显示"你是男生"或"你是女生"。
from tkinter import *
def printSelection():
num=var.get()
if num==1:
label.config(text="你是男生")
else:
label.config(text="你是女生")
root=Tk()
root.title("ch7_1")
var=IntVar()
var.set(1)
label=Label(root,text="这是预设,尚未选择",bg="lightyellow",width=30)
label.pack()
rbman=Radiobutton(root,text="男生",
variable=var,value=1,
command=printSelection)
rbman.pack()
rbwoman=Radiobutton(root,text="女生",
variable=var,value=2,
command=printSelection)
rbwoman.pack()
root.mainloop()
运行结果:
上述var=IntVar()是设置var变量是IntVar()对象,也是整型。var.set(1)是设置默认选项是1,在此相当于默认是男生,
label=Label(root,text="这是预设,尚未选择",bg="lightyellow",width=30)和label.pack()是设置标签信息。
rbman=Radiobutton(root,text="男生",variable=var,value=1,command=printSelection)是创建"男生"选项按钮,
接着是创建"女生"选项按钮。当有单选按钮新建时,会执行函数,这个函数会由var.get()获得目前选项按钮的value值,
然后由此值利用if判断所选的是男生或女生,最后使用config()方法将男生或女生设置给标签对象label的text,所以可以
看到所选的结果。
var值也可以用字符串处理,通常是设置text内容与value内容相同,这时在处理callback函数时,可以比较清晰易懂。
将字典应用在选项按钮上
上述建立选项按钮的方法虽好,但是当选项变多时程序就会显得比较复杂,此时可以考虑使用字典存储按钮相关信息,
然后用遍历字典方式建立选项按钮,可参考下列实例:
为字典内的城市数据建立选项按钮,当我们选择最喜欢的城市时,Python Shell窗口中将列出所选的结果。
>>> from tkinter import *
>>> def printSelection():
print(cities[var.get()])
>>> root=Tk()
>>> root.title("ch7_3")
''
>>> cities={0:"东京",1:"纽约",2:"巴黎",3:"伦敦",4:"香港"}
>>> var=IntVar()
>>> var.set(0)
>>> label=Label(root,text="选择最喜欢的城市",
fg="blue",bg="lightyellow",width=30).pack()
>>> for val,city in cities.items():
Radiobutton(root,
text=city,
variable=var,value=val,
command=printSelection).pack()
盒子选项按钮
tkinter中也提供盒子选项按钮的概念,可以在Radiobutton方法内使用indicatoron参数,将它设为0。
实例:
from tkinter import *
def printSelection():
print(cities[var.get()])
root=Tk()
root.title("ch7_4")
cities={0:"京东",1:"纽约",2:"巴黎",3:"伦敦",4:"香港"}
var=IntVar()
var.set(0)
label=Label(root,text="选择最喜欢的城市",
fg="blue",bg="lightyellow",width=30).pack()
for val,city in cities.items():
Radiobutton(root,
text=city,
indicatoron=0,
width=30,
variable=var,value=val,
command=printSelection).pack()
root.mainloop()
建立含图像的选项按钮
也可以将选项文字用图像取代,它的用法和标签Label相同。
样例:
from tkinter import *
def printSelection():
label.config(text="你选的是"+var.get())
root=Tk()
root.title("ch7_5")
imgStart=PhotoImage(file="start.gif")
imgMoon=PhotoImage(file="moon.gif")
var=StringVar()
var.set("星星")
label=Label(root,text="这是默认值,尚未选择",
bg="lightyellow",width=30)
label.pack()
rbStart=Radiobutton(root,image=imageStar,
variable=var,value="星星",
command=printSelection)
rbMoon.pack()
rbSun=Radiobutton(root,image=imgSun,
variable=var,value="太阳",
command=printSelection)
rbSun.pack()
root.mainloop()
如果要建立含有图像和文字的选项按钮,需要在Radiobutton方法内增加text参数设置文字,
增加compound参数设置图像与文字的位置。
2.复选框(Checkbutton)
Python Tkinter 复选框用来选取我们需要的选项,它前面有个小正方形的方块,如果选中则有一个对号,也可以再次点击以取消该对号来取消选中。
语法
语法格式如下:
w = Checkbutton ( master, option=value, ... )
·master: 按钮的父容器。
·options: 可选项,即该按钮的可设置的属性。这些选项可以用键 = 值的形式设置,并以逗号分隔。
序号 可选项 & 描述
1 activebackground
当鼠标放上去时,按钮的背景色
2 activeforeground
当鼠标放上去时,按钮的前景色
3 bg
按钮的背景色
4 bitmap
位图
5 bd
边框的大小,默认为 2 个像素
6 command
关联的函数,当按钮被点击时,执行该函数
7 cursor
光标的形状设定,如arrow, circle, cross, plus 等
8 disabledforeground
禁用选项的前景色
9 font
文本字体
10 fg
选项的前景色
11 height
复选框文本行数,默认为 1。
12 highlightcolor
聚焦的高亮颜色
13 image
是否使用图标
14 justify
显示多行文本的时候,设置不同行之间的对齐方式,可选项包括LEFT, RIGHT, CENTER
15 offvalue
Checkbutton 的值不仅仅是 1 或 0,可以是其他类型的数值,可以通过 onvalue 和 offvalue 属性设置 Checkbutton 的状态值。
16 onvalue
Checkbutton 的值不仅仅是 1 或 0,可以是其他类型的数值,可以通过 onvalue 和 offvalue 属性设置 Checkbutton 的状态值。
17 padx
按钮在x轴方向上的内边距(padding),是指按钮的内容与按钮边缘的距离,默认为 1 像素。
18 pady
按钮在y轴方向上的内边距(padding),默认为 1 像素。
19 relief
边框样式,设置控件3D效果,可选的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。默认为 FLAT。
20 selectcolor
选中后的颜色,默认为 selectcolor="red"。
21 selectimage
选中后的图片
22 state
状态,默认为 state=NORMAL,若是设置DISABLE则以灰阶显示复选框,表示暂时无法使用。如果鼠标光标在复选框上方显示ACTIVE。
23 text
显示的文本,使用 "\n" 来对文本进行换行。
24 underline
下划线。默认按钮上的文本都不带下划线。取值就是带下划线的字符串索引,为 0 时,第一个字符带下划线,为 1 时,前两个字符带下划线,以此类推
25 variable
设置或取得目前选取的复选框,它的值类型通常是InVar或StringVar。
26 width
复选框的文字有几个字符串,省略时会自行调整为实际宽度。
27 wraplength
限制每行的文字数,默认是0,表示只有"\n"才会换行
方法
以下为常用的方法:
序号 方法 & 描述
1 deselect()
清除复选框选中选项。
2 flash()
在激活状态颜色和正常颜色之间闪烁几次单选按钮,但保持它开始时的状态。
3 invoke()
可以调用此方法来获得与用户单击单选按钮以更改其状态时发生的操作相同的操作
4 select()
设置按钮为选中。
5 toggle()
选中与没有选中的选项互相切换
实例中点击按钮会显示一个信息:
实例
from tkinter import *
root=Tk()
root.title("ch7_7")
lab=Label(root,text="请选择喜欢的运动",fg="blue",bg="lightyellow",width=30)
lab.grid(row=0)
var1=IntVar()
cbtnNFL=Checkbutton(root,text="美式足球",variable=var1)
cbtnNFL.grid(row=1,sticky=W)
var2=IntVar()
cbtnMLB=Checkbutton(root,text="棒球",variable=var2)
cbtnMLB.grid(row=2,sticky=W)
var3=IntVar()
cbtnNBA=Checkbutton(root,text="篮球",variable=var3)
cbtnNBA.grid(row=3,sticky=W)
root.mainloop()