七、选项按钮与复选框

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()

运行结果:


image.png

上述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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容