版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章窗口界面设计1概述图形用户界面(GraphicalUserInterface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。与使用命令行界面相比,图形界面对于用户来说在视觉上更易于接受。从Python语言的诞生之日起,就有许多优秀的GUI工具集整合到Python当中,这些优秀的GUI工具集,使得Python也可以在图形界面编程领域当中大展身手,由于Python的流行,许多应用程序都是由Python结合那些优秀的GUI工具集编写的。常用的GUI工具集包括tkinter、wxPyhton、PyQt等,若开发小型GUI应用程序,用tkinter、wxPython这两个库就足够了,若要开发大型的应用,可以考虑PyQt(Qt提供给python的接口),借助QtDesigner(直接拖拽控件),可以快速的开发出比较整洁、美观的界面。由于tkinter是Python自带的标准库,使用tkinter,无需安装任何包就可以直接使用。所以本书将介绍如何使用标准库tkinter进行GUI编程。210.1tkinter简介tkinter是Python的标准GUI库,在2.x版本库名为Tkinter,3.x版本统一更名为tkinter,本书将以3.x版本为例进行介绍。tkinter是基于Tk工具包的,封装了Tk的接口,Tk工具包是一个图形库,支持多个操作系统,使用Tcl(ToolCommandLanguage,工具命令语言)语言开发。Tk已被移植到很多其他的脚本语言中,包括Perl(Perl/Tk)、Ruby(Ruby/Tk)和Python(tkinter)。结合Tk的GUI开发的可移植性与灵活性,以及与系统语言功能集成的脚本语言的简洁性,可以让你快速开发和实现很多与商业软件品质相当的GUI应用。310.1.1安装和使用tkintertkinter是Python的标准库,是默认安装的,可以通过在Python解释器中尝试导入tkinter模块来检查tkinter是否可用,如下所示:>>>importtkinter>>>#导入后,没有任何提示,说明tkinter导入成功>>>importTkinter#在Python3的环境中导入Tkinter,会报错Traceback(mostrecentcalllast):File"<pyshell#96>",line1,in<module>importTkinterModuleNotFoundError:Nomodulenamed'Tkinter'410.1.1安装和使用tkinter导入tkinter模块成功后,我们就可以使用这个GUI模块了,接下来我们执行tkinter模块的_test()函数。来得到我们的第一个测试窗口示例,如图10-1所示:>>>importtkinter>>>tkinter._test()5图10-1tkinter测试程序界面10.1.2创建第一个窗口界面通常,让tkinterGUI程序启动和运行起来需要以下4个主要步骤:(1)导入tkinter模块(或fromtkinterimport*)。(2)创建一个顶层窗口对象,用于容纳整个GUI应用。若把GUI设计比喻成绘画,那么顶层窗口就相当于画板,所有主要控件都是构建在顶层窗口对象之上的。该对象在tkinter中使用Tk类创建,代码如下所示,结果如图10-2所示:>>>importtkinter>>>top=tkinter.Tk()6图10-2tkinter顶层窗口10.1.2创建第一个窗口界面(3)在顶层窗口对象之上(或者“其中”)构建所有的GUI控件(及其功能)。控件有一些相关的行为,比如按下按钮、移动鼠标、将文本写入文本框等,这些用户行为称为事件,而GUI对这类事件的响应称为回调。通过事件、回调等底层的应用代码可以将这些GUI组件连接起来。(4)进入主事件循环。所有控件设计结束之后,最后要调用主窗口的mainloop()方法,将窗口界面显示在屏幕,进入等待状态(注:若组件未打包,则不会在窗口中显示),准备响应用户发起的GUI事件。710.1.2创建第一个窗口界面例如,我们要创建一个窗口界面显示“Helloworld!”,向世界打招呼,结果如图10-3所示。>>>#第1步,使用tkinter前需要先导入>>>importtkinterastk>>>#第2步,实例化object,建立窗口window>>>root=tk.Tk()>>>root.title('Helloworld')#给窗口起名字>>>root.geometry('500x300+400+200')#设定窗口的大小(长*宽+x轴位移+y轴位移),这里的乘是小x>>>#第3步,在图形界面上设定控件>>>lab=tk.Label(root,text='Helloworld!',bg='red',font=('Arial',12),width=30,height=2)#说明:bg为背景,font为字体,width为长,height为高,这里的长和高是字符的长和高,比如height=2,就是标签有2个字符这么高>>>lab.pack()#放置控件>>>#第4步,主窗口循环显示>>>root.mainloop()810.1.3tkinter常用控件tkinter提供各种控件(又叫组件或部件),如按钮,标签和文本框等,目前有20种tkinter的控件。控件及其功能描述如表10-1所示,10.2节将对常用的控件做详细介绍。910控件描述Button按钮:在程序中显示按钮,点击时执行一个动作例如鼠标掠过、按下、释放以及键盘操作/事件。Canvas画布:提供绘图功能(直线、椭圆、多边形、矩形)可以包含图形或位图。Checkbutton复选框:用于在程序中提供多项选择框,允许用户选择或反选一个选项,一组方框可以选择其中的任意多个(类似HTML中的checkbox)Entry单行文本框:用于显示一行的文本内容。Frame框架:在屏幕上显示一个矩形区域,多用来作为容器承载放置其他GUI元素。Label标签:用于显示不可编辑的文本或图标。Listbox列表框:用来显示一个选项列表,用户可以从中选择。Menu菜单:显示菜单栏,下拉菜单和弹出菜单。Menubutton菜单按钮:用于显示菜单项。Message消息:用来显示多行文本,与label比较类似。OptionMenu选择菜单:下拉菜单的一个改版,补了Listbox无法下拉列表框的遗憾。Radiobutton单选按钮:显示一个单选的按钮状态,一组按钮只允许用户从多个选项中选取一个,(类似HTML中的radio)。Scale范围控件:显示一个数值刻度,为输出限定范围的数字区间,可设定起始值和结束值,会显示当前位置的精确值。Scrollbar滚动条:当内容超过可视化区域时使用,如列表框。Text文本控件:用于显示多行文本。Toplevel顶层容器:用来提供一个容器窗口部件,作为一个单独的、最上面的窗口显示。Spinbox输入控件:与Entry类似,但是可以指定输入范围值。PanedWindow窗口布局管理控件:是一个窗口布局管理的插件,可以包含一个或者多个子控件。LabelFrame标签框架:是一个简单的容器控件,常用于复杂的窗口布局。messageBox消息框:用于显示应用程序的消息框,Python2中为tkMessagebox。10.1.4控件标准属性控件标准属性也就是大多数控件的共同属性,如大小,字体和颜色等等,如表10-2所示:11属性说明anchor锚点,指出控件信息(比如文本或者位图)如何在控件中显示。必须为下面值之一:N、NE、E、SE、S、SW、W、NW或者CENTER。如NW(NorthWest)指显示信息时使左上角在控件的左上端。background(bg)指定控件的背景色。如指定背景色为‘gray25’或‘#ff4400’。borderwidth(bd)控件边框的宽度。默认值与特定平台相关。但通常是1或2象素。cursor当鼠标移动到控件上时所显示的光标。如‘gumby’。font指定控件内部文本的字体及大小等。如‘Helvetica’、(‘Verdana’,8)、("Helvetica16bolditalic")。控件Canvas、Frame、Scrollbar、Toplevel不具备该属性。foreground(fg)指定控件的前景色。如‘black’或‘#ff2244’。控件Canvas、Frame、Scrollbar、Toplevel不具备该属性height指定控件的高度,采用字体选项中给定字体的字符高度为单位,至少为1。highlightbackground指出经过没有输入焦点的控件加亮区域颜色。如‘gray30’。控件Menu不具备该属性。highlightcolor指出经过没有输入焦点的控件周围长方区域加亮颜色。如‘royalblue’。控件Menu不具备该属性。highlightthickness设置一个非负值,该值指出一个有输入焦点的控件周围加亮方形区域的宽度,该值如果为0,则不画加亮区,单位为像素。控件Menu不具备该属性。image指定所在控件中显示的图像。relief指出控件3D效果.可选值为RAISED、SUNKEN、FLAT、RIDGE、SOLID、GROOVE,该值指出控件内部相对于外部的外观样式,比如RAISED意味着控件内部相对于外部突出。takefocus决定窗口在键盘遍历时是否接收焦点(比如Tab,shift-Tab)。在设定焦点到一个窗口之前,遍历脚本检查takefocus选项的值,值0意味着键盘遍历时完全跳过,值1意味着只要有输入焦点(它及所有父代都映射过)就接收,空值由脚本自己决定是否接收。width指定一个整数,设置控件宽度,如果值小于等于0,控件选择一个能够容纳目前字符的宽度。控件Menu不具备该属性。10.2tkinter常用控件示例10.2.1按钮类控件1.Label标签在tkinter中,Label控件用以显示文字和图片。Label通常被用来展示信息,而非与用户交互。用法:Label(根对象,[属性列表])其中,根对象若不指定,则默认为顶层根窗口对象;Label标签控件,除了标准属性外,还具有以下3个常用属性:justify:多行文本的对齐方式;text:标签中的文本,可以使用'\n'表示换行;textvariable:与Label标签控件相关的Tk变量(通常与StringVar等配合着用,即通常是一个字符串变量),如果这个变量的值改变,那么Label标签上的文本也会相应更新。121.Label标签例10-1Label标签控件示例,如代码Label.py所示:#Label.py#第1步,导入tkinterfromtkinterimport*#第2步,建立顶层窗口rootroot=Tk()root.title('Label示例')#给窗口起名字root.geometry('300x200')#设定窗口的大小(长*宽),这里的乘是小x#第3步,在图形界面上创建标签lab1=Label(root,text="user-name",bg='blue',font=('Arial12bold'),width=20,height=5)lab1.pack()
lab2=Label(root,text="password",bg='yellow',width=20,height=5)lab2.pack()#第4步,进入主窗口消息循环root.mainloop()132.Button按钮Button控件是一种标准tkinter控件,用来展现不同样式的按钮。Button控件被用以和用户交互,比如按钮被鼠标点击后,某种操作被启动。按钮上可以展示图片或者文字,文字可以多行显示,但只能使用单一的字体。可以将一个Python函数或方法绑定到一个Button控件,作为回调函数,这个函数或方法将在按钮被点击时执行。用法:Button(根对象,[属性列表])142.Button按钮其中,根对象若不指定,则默认为顶层根窗口对象;Button控件属性除标准属性外,还具有如下属性:command:指定按钮消息的回调函数;state:设置控件状态,正常(normal)、激活(active)、禁用(disabled);text:指定按钮上显示的文本;padx:设置文本与按钮边框x的距离;pady:设置文本与按钮边框y的距离;textvariable:与按钮相关的Tk变量(通常与StringVar等配合着用,即通常是一个字符串变量),如果这个变量的值改变,那么按钮上的文本相应更新。activeforeground按下时前景色。152.Button按钮例10-1Button控件示例,如代码Button.py所示:#Button.py#第1步,导入tkinterimporttkinterastk
#第2步,建立顶层窗口rootroot=tk.Tk()root.title('Button示例')#给窗口起名字root.geometry('300x200')#设定窗口的大小(长*宽),这里的乘是小x
#第3步,在图形界面上设定标签#1.先放一个Label标签var=tk.StringVar()#将label标签的内容设置为字符类型,用var来接收回调函数的传出内容用以显示在标签上lab=tk.Label(root,textvariable=var,bg='blue',fg='white',font=('Arial',12),width=30,height=2)#创建控件lab.pack()162.Button按钮#2.定义一个回调函数,供点击Button按键时调用,实现点击按钮切换Label控件的显示内容。on_hit=Falsedefhit_me():globalon_hitifon_hit==False:on_hit=Truevar.set('youhitme')else:on_hit=Falsevar.set('')#3.在窗口界面放置Button按键#将回调函数属性command设置为函数hit_mebtn=tk.Button(root,text='hitme',font=('Arial',12),width=10,height=1,command=hit_me)btn.pack()#放置按钮
#第4步,主窗口循环显示root.mainloop()173.RadioButton单选按钮单选按钮是一种可在多个预先定义的选项中选择出一项的tkinter控件。单选按钮可显示文字或图片。显示文字时只能使用预设字体。该控件可以绑定一个Python函数或方法,当单选按钮被选择时,该函数或方法将被调用。一组单选按钮控件和同一个变量关联。点击其中一个单选按钮将把这个变量设为某个预定义的值。用法:Radiobutton(根对象,[属性列表])其中属性与Button大多重合,用法一致。特殊属性value指定组件被选中后关联变量的值;variable指定组件所关联的变量;indicatoron特殊控制参数,当为0时,控件会被绘制成按钮形式。183.RadioButton单选按钮例10-3RadioButton控件示例,如代码RadioButton.py所示。#RadioButton.py#第1步,导入tkinterimporttkinterastk
#第2步,建立顶层窗口rootroot=tk.Tk()root.title('Button示例')#给窗口起名字root.geometry('300x200')#设定窗口的大小(长*宽),这里的乘是小x
#第3步,在图形界面上设定标签var=tk.StringVar()#定义关联变量lab=tk.Label(root,width=25,text='请选择一门你最想学的语言:')lab.pack()193.RadioButton单选按钮#定义回调函数,将lab控件文本显示为所选内容。defcall_rb():lab.config(text='你选择的语言是:'+var.get())#创建三个radiobutton选项,其中variable=var,value='A'的意思就是,#当我们鼠标选中了其中一个选项,把value的值A放到关联变量var中。rb1=tk.Radiobutton(root,text='Python',variable=var,value='Python',command=call_rb)rb1.pack(anchor='w')rb2=tk.Radiobutton(root,text='C++',variable=var,value='C++',command=call_rb)rb2.pack(anchor='w')rb3=tk.Radiobutton(root,text='Java',variable=var,value='Java',command=call_rb)rb3.pack(anchor='w')#第4步,主窗口循环显示root.mainloop()204.CheckButton多选按钮CheckButton控件是复选框,又称为多选按钮。其用法与RadioButton一致,不同的是CheckButton可在一组预先定义的选项中选择出多项。多选按钮还有一些可供使用的方法,如select()、deselect()用于选择或去掉选择。214.CheckButton多选按钮例10-4CheckButton多选按钮示例,如代码CheckButton.py所示:#CheckButton.pyfromtkinterimport*top=Tk()top.title('Checkbutton示例')top.geometry('300x200')
defcallCb():labtext='你选的课程是:'if(cbvar1.get()==1):#如果选中第一个选项labtext=labtext+'Java'if(cbvar2.get()==1):#如果选中第二个选项labtext=labtext+'C++'if(cbvar3.get()==1):#如果选中第三个选项labtext=labtext+'Python'labState.config(text=labtext)#设置Label标签显示选课内容224.CheckButton多选按钮#关联变量,用来获取复选框是否被勾选,通过cb1var.get()来获取其的状态,其状态值为int类型,勾选为1,未勾选为0cbvar1=IntVar()#text为该复选框后面显示的名称,variable将该复选框的状态赋值给一个变量,cb1=Checkbutton(top,text="Java",variable=cbvar1,onvalue=1,offvalue=0,command=callCb)cb1.deselect()cb1.grid(column=0,row=0,sticky='w')cbvar2=IntVar()cb2=Checkbutton(top,text="C++",variable=cbvar2,onvalue=1,offvalue=0,command=callCb)cb2.select()cb2.grid(column=1,row=0,sticky='w')cbvar3=IntVar()#当state='disabled'时,该复选框为灰色,不能点的状态,即Python为必选课程cb3=Checkbutton(top,text="Python",variable=cbvar3,onvalue=1,offvalue=0,state='disabled',command=callCb)#调用复选框select()方法设置该复选框初始化为勾选状态,deselect()为不勾选cb3.select()cb3.grid(column=2,row=0,sticky='w')234.CheckButton多选按钮labState=Label(top,width=25,text='请选择你要学习的课程:',anchor='w')labState.grid(column=0,columnspan=3,row=1,sticky='w')#进入消息循环top.mainloop()245.Listbox列表框Listbox为列表框控件,它可以包含一个或多个文本项,可以设置为单选或多选。用法:Listbox(根对象,[属性列表])特殊属性:master代表了父窗口;state设置控件状态,正常(normal)、激活(active)、禁用(disabled);selectmode选择模式,MULTIPLE(多选)、BROWSE(通过鼠标的移动选择)、EXTENDED(shift和ctrl配合使用)。255.Listbox列表框常用方法:insert:追加item,如listbox.insert(0,"addBox1","addBox2")delete:删除item,如listbox.delete(3,4),删除全部(0,END)select_set:选中,如listbox.select_set(0,2)select_clear:取消选中如listbox.select_clear(0,1)get:返回制定索引的项值,如listbox.get(1);返回多个项值,返回元组,如listbox.get(0,2);返回当前选中项的索引listbox.curselection()curselection:返回当前选中项的索引,如listbox.curselection()selection_includes:判断当前选中的项目中是否包含某项,如listbox.selection_includes(4)265.Listbox列表框例10-5Listbox列表框示例,如代码Listbox.py所示。importtkinterastkwindow=tk.Tk()window.title('Listbox示例')window.geometry('300x200')
#创建结果显示Labelvar1=tk.StringVar()lab0=tk.Label(window,text='你选择了:',width=10)lab1=tk.Label(window,width=10,textvariable=var1)lab0.grid(column=0,row=0,sticky='e')lab1.grid(column=1,row=0,sticky='w')275.Listbox列表框#创建Listboxvar2=tk.StringVar()var2.set(('Java','C++','Python'))#为变量var2设置值lb=tk.Listbox(window,listvariable=var2)#将var2的值赋给Listbox
#通过列表为Listbox控件增加项lst=['Ruby','Scala']foriteminlst:lb.insert('end',item)#从最后一个位置开始加入值lb.insert(0,'空')#在第一个位置加入'空'字符lb.insert(2,'C')#在第二个位置加入'second'字符lb.delete(2)#删除第二个位置的字符lb.grid(column=0,row=1,sticky='e')285.Listbox列表框#创建按钮的回调函数defcall_btn():value=lb.get(lb.curselection())#获取Listbox当前选中的文本var1.set(value)#为Label的关联变量赋值
#创建按钮,回调call_btn函数b1=tk.Button(window,text='确定',width=15,height=2,command=call_btn)b1.grid(column=1,row=1,sticky='w')
#主窗口循环显示window.mainloop()2910.2.2文本输入类控件1.Entry单行文本框Entry是用来接收字符串等输入的控件。该控件只允许用户输入一行文字,如果用户输入的文字长度长于Entry控件的宽度时,文字会向后滚动,这种情况下所输入的字符串无法全部显示,点击箭头符号可以将不可见的文字部分移入可见区域。用法:Entry(根对象,[属性列表])单行文本框可以通过show属性控制文本的显示方式;通过insert()、delete()方法插入或删除文本;通过bind()方法绑定回车事件及其响应函数。301.Entry单行文本框例10-6Entry单行文本框示例,如代码Entry.py所示:#Entry.pyimporttkinterastkroot=tk.Tk()root.title('Entry示例')root.geometry('300x200')lab1=tk.Label(root,text='用户名:')lab2=tk.Label(root,text='密码:')#创建单行文本框e1=tk.Entry(root,show=None,font=('Helvetica',12))#显示成密文形式e2=tk.Entry(root,show='*',font=('Helvetica',12))#显示成明文形式#放置控件lab1.grid(column=0,row=0,sticky='w')e1.grid(column=1,row=0,sticky='w')lab2.grid(column=0,row=1,sticky='w')e2.grid(column=1,row=1,sticky='w')#主窗口循环显示root.mainloop()312.Text多行文本框Text控件用来为用户提供一个输入多行文本的区域,显示多行文本,格式化文本显示,允许用不同的样式和属性来显示和编辑文本,同时支持内嵌图象和窗口,所以常常被用于作为简单的文本编辑器和网页浏览器使用,本书仅介绍Text控件的基本使用方式。用法:Text(根对象,[属性列表])当创建一个Text组件的时候里面是没有内容的。为了给其插入内容,可以使用insert()以及INSERT或END索引号。322.Text多行文本框例10-6Text多行文本框示例,如代码Text.py所示#Text.pyfromtkinterimport*
root=Tk()root.title('Text示例')root.geometry('300x400')
lab0=Label(root,width=10,text='以下为文本框')lab0.pack()
#创建文本框text1=Text(root,width=30,height=10)text1.pack()text1.insert(INSERT,'IloveChina!\n')332.Text多行文本框#text还可以插入按钮、图片等defcall_btn():text1.insert(END,'\n按钮在文本框内!')bt1=Button(text1,text='文本框内按钮',command=call_btn)#在Text中创建子控件的命令text1.window_create(INSERT,window=bt1)#向文本框输入内容后,获取其内容并展示defshow_text():labVar.set(text1.get('1.0',END))bt2=Button(root,text='获取文本框内容',command=show_text)bt2.pack()
labVar=StringVar()lab1=Label(root,width=12,text='文本框内容为:')lab2=Label(root,width=30,height=10,bg='yellow',textvariable=labVar)lab1.pack()lab2.pack()342.Text多行文本框3510.2.3菜单及滚动条控件1.Menu菜单Menu控件被用来创建一个菜单,用于显示菜单栏,下拉菜单,弹出菜单,点下菜单后弹出一个选项列表,用户可以从中进行选择。用法:首先要用Menu(根对象,[属性列表])创建Menu控件,然后使用add方法添加命令或者子菜单内容。常用方法:add_cascade:添加子选项;add_command:添加命令(label参数为显示内容);add_separator:添加分隔线;add_checkbutton:添加确认按钮;delete:删除。361.Menu菜单例10-7Menu菜单示例,如代码Menu.py所示#Menu.pyfromtkinterimport*root=Tk()root.title("Menu示例")root.geometry("300x200")labvar=StringVar()lab=Label(root,textvariable=labvar,font=('16,bold'))lab.pack()defdoedit():labvar.set('doEdit......')
#1.创建一个菜单控件menubar=Menu(root)root.config(menu=menubar)#用顶层窗口的menu属性指定menubar作为它的顶层菜单371.Menu菜单#2.创建下拉菜单,作为子菜单项menu1=Menu(root)foriin['NewFile','Open','Save','Saveas']:menu1.add_command(label=i)#为下拉菜单添加命令,label属性用于指定菜单的显示名称
menu2=Menu(root)foriin['Cut','Copy','Paste']:menu2.add_command(label=i,command=doedit)#command属性用于设置触发事件
menu3=Menu(root)foriin['ViewLastRestart','RestartShell']:menu3.add_command(label=i)
menu4=Menu(root)foriin["GotoFile","Debugger"]:menu4.add_command(label=i)381.Menu菜单#3.创建一级菜单,将下拉菜单添加到对应的一级菜单menubar.add_cascade(label="File",menu=menu1)#menu属性用于指定一级菜单对应的下拉菜单menubar.add_cascade(label="Edit",menu=menu2)menubar.add_cascade(label="Shell",menu=menu3)menubar.add_cascade(label="Debug",menu=menu4)#进入消息循环root.mainloop()392.Scrollbar滚动条控件Scrollbar滚动条控件,可以单独使用,但最多的还是与其它控件(Listbox、Text、Canvas等)结合使用。用法:Scrollbar(根对象,[属性列表])例10-8Scrollbar控件示例,代码如Scrollbar.py所示。#Scrollbar.py'''Listbox与Scrollbar之间的关系:1.当Listbox改变时,Scrollbar调用set以改变滑块的位置;2.当Scrollbar改变了滑块的位置时,Listbox调用yview以显示对应位置的内容'''fromtkinterimport*#初始化Tk()root=Tk()root.title("Scrollbar示例")root.geometry("300x200")scrollbar=Scrollbar(root)scrollbar.pack(side=RIGHT,fill=Y)#side指定滚动条的位置,fill指定滚动条填充满Y轴整个区域402.Scrollbar滚动条控件mylist=Listbox(root,yscrollcommand=scrollbar.set)#yscrollcommand指定Listbox的yscrollbar的事件处理函数为Scrollbar的setforlineinrange(100):mylist.insert(END,str(line))mylist.pack(side=LEFT,fill=Y)
scrollbar.config(command=mylist.yview)#指定Scrollbar的command的事件处理函数是Listbox的yview
#进入消息循环root.mainloop()4110.2.4框架类控件1.Frame框架Frame框架控件,是在屏幕上创建一块矩形区域,多作为容器来布局窗体,将多个控件编组。用法:Frame(根对象,[属性列表])特殊属性:borderwidth(bd):指定Frame的边框宽度,默认值是0;padx :水平方向上的边距;pady :垂直方向上的边距;relief:指定边框样式为"flat"、"sunken"、"raised"、"groove"或"ridge",默认是"flat"。但bd参数不为0时才能看到边框。421.Frame框架例10-9Frame框架示例,如代码Frame.py所示。#Frame.pyfromtkinterimport*
root=Tk()root.title("Frame示例")root.geometry("300x200")
#1.创建一个frame控件frm=Frame(root,bd=3,relief='groove')frm.pack(fill=BOTH)431.Frame框架#2.在frm中再创建一个左侧框架,用于放置两个Label标签frm_1eft=Frame(frm,bd=3,relief='sunken')#创建一个frm_1eft并且放到frm上Label(frm_1eft,text="左上",width=10,height=5,bg="pink",bd=2).pack()#创建一个Lable放到frm_1eft上Label(frm_1eft,text="左下",width=10,height=5,bg="green",bd=2).pack()#创建第二个Lable放到frm_1eft上frm_1eft.pack(side=LEFT)#设置frm_1eft的位置,放在左侧
#3.在frm中再创建一个右侧框架,用于放置两个Label标签frm_right=Frame(frm,bd=3,relief='raised')Label(frm_right,text="右上",width=10,height=5,bg="red",bd=2).pack()Label(frm_right,text="右下",width=10,height=5,bg="yellow",bd=2).pack()frm_right.pack(side=RIGHT)root.mainloop()##窗口持久化442.Toplevel顶层容器Toplevel控件为其他空间提供单独的容器。例如主窗口本身就是一个Toplevel,而我们又可以在主窗口外添加额外的窗口,可以把不同功能的控件分到不同窗口上,也可以用来当弹窗使用。Toplevel有四种类型:(1)主顶层,作为根被引用;(2)子顶层,依赖于根,若根被破坏,则子顶层也被破坏;(3)临时顶层,总是位于父顶层的顶部,如果父顶层被图标化或最小化之后,则它们被隐藏起来;(4)未被视窗管理者创建过的顶层,可以通过设置一个overrideredirect标志为非零值来创建,该窗口不能被缩放或拖动。需要注意的是主窗口一关其它小窗口就自动关掉了,不能独立存在。452.Toplevel顶层容器示例代码如下:fromtkinterimport*root=Tk()root.title('Toplevel')Label(root,text='主顶层(默认)').pack(pady=10)
t1=Toplevel(root)#创建子顶层窗口Label(t1,text='子顶层').pack(padx=10,pady=10)
t2=Toplevel(root)Label(t2,text='临时顶层').pack(padx=10,pady=10)t2.transient(root)#注册为临时顶层窗口
t3=Toplevel(root,borderwidth=5,bg='green')Label(t3,text='不被视窗管理的顶层控件',bg='blue',fg='white').pack(padx=10,pady=10)t3.overrideredirect(1)#注册为不被视窗管理的顶层控件t3.geometry('300x100+150+150')
root.mainloop()463.messagebox消息框messagebox消息框,用于显示应用程序的交互式消息对话框,即弹窗。一般需要触发事件来触发。以下是messagebox的几种常用形式:显示类:(1)showinfo(title=None,message=None,**options):信息显示消息对话框,其中title用于指定对话框标题,message用于指定消息框所显示的消息。>>>fromtkinterimport*>>>fromtkinterimportmessagebox>>>print(messagebox.showinfo(title='信息显示对话框',message='现在学习的messagebox控件'))ok#点击“确定”按钮返回“ok”473.messagebox消息框(2)showerror(title=None,message=None,**options):错误消息对话框>>>print(messagebox.showerror(title='错误消息对话框',message='出错啦!'))ok#点击“确定”按钮返回“ok”483.messagebox消息框(3)showwarning(title=None,message=None,**options):警告消息对话框>>>print(messagebox.showwarning(title='警告消息对话框',message='警告!这样做很危险!'))ok#点击“确定”按钮返回“ok”493.messagebox消息框提问类:(1)askquestion(title=None,message=None,**options):问题对话框>>>print(messagebox.askquestion(title='问题对话框',message='这是你的问题吗?'))yes#点击“是”按钮,返回“yes”>>>print(messagebox.askquestion(title='问题对话框',message='这是你的问题吗?'))no#点击“否”按钮,返回“no”503.messagebox消息框(2)askokcancel(title=None,message=None,**options):确定\取消对话框>>>print(messagebox.askokcancel(title='确定或取消对话框',message='你确定要这样做吗?'))True#点击“确定”返回“True”>>>print(messagebox.askokcancel(title='确定或取消对话框',message='你确定要这样做吗?'))False#点击“取消”返回“False”513.messagebox消息框(3)askretrycancel(title=None,message=None,**options):重试对话框>>>print(messagebox.askretrycancel(title='重试取消对话框',message='你要重试吗?'))True#点击“重试”返回“True”>>>print(messagebox.askretrycancel(title='重试取消对话框',message='你要重试吗?'))False523.messagebox消息框(4)askyesno(title=None,message=None,**options):Yes\No是否对话框>>>print(messagebox.askyesno(title='是或否对话框',message='选择是还是否?'))True#点击“是”返回“True”>>>print(messagebox.askyesno(title='是或否对话框',message='选择是还是否?'))False#点击“否”返回“False”533.messagebox消息框(5)askyesnocancel(title=None,message=None,**options):是否或取消对话框>>>print(messagebox.askyesnocancel(title='是否或取消对话框',message='选择是还是否还是取消?'))True#点击“是”返回“True”>>>print(messagebox.askyesnocancel(title='是否或取消对话框',message='选择是还是否还是取消?'))False#点击“否”返回“False”>>>print(messagebox.askyesnocancel(title='是否或取消对话框',message='选择是还是否还是取消?'))None#点击“取消”返回“None”5410.3布局管理界面设计除了控件之外还有一个重要的问题就是如何根据界面设计的需求,将控件以规定的大小放置在规定的位置,虽然控件自己也可以指定大小和对齐方式等信息,但最终的控件大小及位置还是由布局管理决定的。tkinter控件的布局管理方式有三种:pack()、place()、grid()。需要注意的是这三种布局管理在同一个顶层窗口内是不可以混用的。5510.3.1pack方式pack相对位置方式,是三种布局管理中最常用的。另外两种布局需要精确指定控件具体的显示位置,而pack布局可以指定相对位置,控件的具体位置会由pack系统自动完成,所以pack是简单应用的首选布局。用法:调用相应控件的pack()方法即可特殊属性:side:指定控件在主窗口的位置,可以为top、bottom、left、right;expand:是否扩展独占空间之外的控件,1可扩展,0不可扩展;fill:控件填充方式,有四个取值none(默认不填充)、Y(垂直方向填充)、X(水平方向填充)、BOTH(垂直水平都填充),expand为0时,只能填充独占空间方向;padx:x方向的外边距;pady:y方向的外边距;ipadx:x方向的内边距;ipady:y方向的内边距5610.3.1pack方式例10-10pack布局管理示例,代码如pack.py所示。#pack.pyfromtkinterimport*root=Tk()root.title('pack相对位置方式')root.geometry('300x200')
#pack放置方法Label(root,text='top',bg='red').pack(side='top',fill=X)#expand默认为0,所以fill只在X方向上起作用Label(root,text='bottom',bg='green').pack(side='bottom',fill=X)Label(root,text='left',bg='blue').pack(side='left',fill=Y)Label(root,text='right',bg='yellow').pack(side='right',expand=1,fill=BOTH)#expand为1,双向方向都可填充
root.mainloop()5710.3.2place方式place绝对位置方式,显式的指定控件的绝对位置或相对于其他控件的位置。用法:调用相应控件的place()方法即可特殊属性:x:指定该控件的水平偏移位置(像素),如同时指定了relx选项,优先实现relx选项,然后在此位置基础上计算偏移位置;y:指定该控件的垂直偏移位置(像素),如同时指定了rely选项,优先实现rely选项,然后在此位置基础上计算偏移位置;relx:指定该控件相对于父控件的水平位置,取值范围0.0~1.0;rely:指定该控件相对于父控件的垂直位置,取值范围0.0~1.0;relheight:指定该控件相对于父控件的高度,取值范围0.0~1.0;relwidth:指定该控件相对于父控件的宽度,取值范围0.0~1.0;5810.3.2place方式例10-11place布局管理示例,代码如place.py所示。#place.pyimporttkinterastkroot=tk.Tk()root.title('place绝对位置方式')root.geometry('300x200')
tk.Label(root,bg="blue",fg="white",width=20,text="place绝对位置方式").place(x=30,y=10)tk.Label(root,bg="red").place(relx=0.1,rely=0.2,relheight=0.75,relwidth=0.75)tk.Label(root,bg="yellow").place(relx=0.1,rely=0.2,relheight=0.5,relwidth=0.5)tk.Label(root,bg="green").place(relx=0.1,rely=0.2,relheight=0.25,relwidth=0.25)
root.mainloop()5910.3.3grid方式grid网格布局方式,是把控件位置作为一个二维表结构来维护,即按照行列的方式排列控件:控件位置由其所在的行号和列号决定,行号相同而列号不同的几个控件会被彼此左右排列,列号相同而行号不同的几个控件会被彼此上下排列。使用grid布局的过程就是为各个控件指定行号和列号的过程,不需要为每个格子指定大小,grid布局会自动设置一个合适的大小。用法:调用相应控件的grid()方法即可特殊参数:row:指的是排在第几行;rowspan:指的是占有多少行;column:指的是排在第几列;columnspan:指的是占有几列;sticky:指的是对齐固定方式,有4个方位,分别是n(nouth)、s(south)、e(east)、w(west)。6010.3.3grid方式例10-12place布局管理示例,代码如place.py所示。#grid.pyimporttkinterastk
root=tk.Tk()root.title('grid网格布局方式')root.geometry('300x200')
colours=['red','green','orange','white','yellow','blue']
r=0forcincolours:Label(root,text=c,relief=RIDGE,width=15).grid(row=r,column=0)Entry(root,bg=c,r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海市金山区2025-2026学年第二学期质量监控高三数学试卷
- 2026年高职(光伏发电技术)电站运维流程综合测试题及答案
- 2026年高职(高速铁路工程技术)高铁建设流程专项测试题及答案
- 工作方案:点燃火种照亮未来-基于“优势发展”的高中学生激励与成长计划
- 武亿:乾嘉金石学领域的学术贡献与时代印记
- 正则化边界元方法求解二维弹性力学边界条件识别反问题研究
- 2026年单位能源管理考试试题及答案
- 2026年会计职业道德考试试题及答案
- 欠发达地区科技支撑经济发展体系构建与实践-以江西省科技创新“六个一”工程为范例
- 橘荔散结片联合GnRH-a治疗围绝经期子宫肌瘤合并异常子宫出血的疗效与机制探究
- 2026春季中国工商银行辽宁分行校园招聘72人备考题库附答案详解(夺分金卷)
- 环氧地坪施工合同模板与范本
- 医疗纠纷处理与防范考核培训
- 三级 模块三 项目九 心理辅导 任务一 正确应对岗位工作压力
- 班组内部管理办法制度
- 黑龙江省考面试真题(省市级综合类)
- 2026年高考历史全真模拟试卷及答案(共五套)
- 2026年南阳科技职业学院单招职业技能考试题库带答案详解(a卷)
- 2025年邮政四级副干部竞聘笔试考试题及答案
- 2026年春季人教PEP版四年级下册英语Unit 3 Time for school 教案(共6课时)
- 2025年四川传媒学院马克思主义基本原理概论期末考试模拟题含答案解析(必刷)
评论
0/150
提交评论