版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
GUI本章,学习GUI(Graphics 即图形用户界面编程,我们可以通过python提供的丰富的GUI编程类似于“搭积木”,将一个个组件(Widget)放到窗口中。如下是windows中的画图软件,就是一个典型的GUI程序:上面的各种按钮、菜单、编辑区域等都是一个个组件,它们都放置到窗口中,并通过增加“对事件的处理”成为一个完整的程序。常用的GUItkinter(Tkinterface)是Python的标准GUI库,支持跨平台的GUI程序开发。tkinter适合小型的GUI程序编写,也特别适合初学者学习GUI编程。本书以tkinter为进功能强于tkinter,整体设计框架类似于MFC(FoundationClasses微软基础类库)。QtGUIGUI程序开发PyQT是Qt工具包标准的Python实现。我们也可以使用QtDesginer界面设计器快速开发GUI应用程序。tkinter提供的文档:tkinter:或者:(相对规整,适合由于都是英文,我们在授课过程中尽量不涉及。英文好的同学可以自行查找相关说明。我们也希望英文较差的同学也能尽量多的学习英文,对于后续技术的理解有较大的帮助。大家也可以去“尚学堂”官网我们提供的常见0个开发词汇。GUI编程的步骤和第一个GUI程基于tkinter模块创建GUI程序包含如下4个步骤创建应用程序主窗口对象(也称:根窗口fromtkinterimportrootfromtkinterimportroot=btn01=(Buttonbtn01=btn01[btn01["text"]=通过几何布局管理器,管理组件的大小和事件处通过绑定事件处理程序,响应用户操作所触发的事 messagebox.showinfo("Message","送 messagebox.showinfo("Message","送你一朵玫瑰花,你爱上我print("送你99朵玫瑰btn01.bind("<Button-tkinter模块,创建GUI应用程序,并实现点fromfromtkinterimportfromtkinterimportroot=btn01btn01= tkinter主窗‘h+x表示距屏幕左边的距离;-x表示距屏幕右边的距离;+y表示距屏幕上边的距离;-y表示距屏幕下边的距离。fromtkinterimportroot=fromtkinterimportroot= 执行结果GUI组件还能在里面再放置其他组件,我们称为“容器”。Tkinter的GUI组件关系图如下: tkinter中GUI组件的继承关系图Mis和Tkinter的GUIobjectis它是所有组件的根父类Wm它主要提供了一些与窗口管理器通信的功能函数接使用Tk。ck、Place、aseieigWidget是所有组件类的父类。Widget一共有四个父类:BaseWidget、Pack、GridPlace。意味着,所 GUI组件同时具备这四个父类的属性和方法【注】想观察类的层次结构可以在类定义处的类名上单击右键,选择Diagram-->showTkinter 容器类,可用于为其他组件提供单独的容器;Toplevel用于装载其它GUI组件类似 ,但可以显示多行文本;后来当Label也能显GUI应用程序类的经典写本节程序也是GUI应用程序编写的一个主要结构,采用通过类Application组织整个GUI程序,类继承了 及通过继承拥有了父类的特性。通过构造函t ()初始化窗口中的对象,通过cetedget()Frame框架是一个tkinter组件,表示一个矩形的区域。GUI"""测试一个经典的GUI程序的写法,使用面向对fromtkinterimportfromtkinterimportclass"""一个经典的GUI程序 init(self,super().init(master) self.master=masterdef"""self.btn01=Button(self)self.btn01["text"]="点击送花"self.btn01["commandself.songhua#创建一个退self.btnQuitButton(selftext="退出def =='main':root=Tk()app=Application(master=root)简单组LabelLabel()主要用于显示文本信息,也可以显示图像Label()有这样一些常见属性大小为单位(一个汉字宽度占2个字符位置,高度和英文字符一样);如果显示是图像,则以像素为单位。默认值是根据具体显示的内容动态调整。指定字体和字体大小,如:font=显示在Label上的图像,目前tkinter只支持gif格式fgfg(foreground):前景色、bg(background):背景针对多行文字的对齐,可设置justify属性,可选值"left","center"or"right"【示例】Label()的用"""测试Label组件的基本用法,使用面向对象的fromtkinterimport*classApplication(Frame): init(self,super().init(master) self.master=masterdef"""self.label01Label(self,text="百战程序员bg="black",fg="white")self.label02=Label(self,text=" ",",#显示图globalphoto #把photo photo=PhotoImage(file="imgs/logo.gif")self.label03=Label(self,image=photo)self.label04=Label(self,text=" 员\n老高好帅,就是做饭不行",ifname=='main':root=Tk()app=Application(master=root)运行结果如下Options选项详fredfred=Button(self,fg="red",fred["bg"]=创建对象后,使用config()方fred.config(fg="red",fred.config(fg="red",如何查看组件的Options可以通过打印config()方法的返回值,查看Options选通过在IDE我们可以看到如下的代classclassdefinit(self,master=None,cnf={},WIDGET-Widget.init(self,master,'button',cnf,含指定组件处于激活状态时的背景指定组件处于激活状态时的前景W、NWCENTER。比如NW(NorthWest)指定将信息显示在组件的左指定组件正常显示时的背指定在组件上显示该选项指定的位图,该选项值可以接的的位图。位图的显示方式受anchor、justify选项的影响。如果同时指定了bitmaptextbitmap覆盖文本;如果同时指定了bitmapimageimage覆盖指定光标在组件上的样式。该值可以是Tk_GetCursors指定按组件关联令方法,该方法通常在鼠标离开组件时被触发调指定组件处于禁用状态时的前景指定组件上显示的文本字指定组件正常显示时的前指定组件在高亮状态下的背景色指定组件在高亮状态下的前景色指定组件在高亮状态下的周围方形区域的宽度,该值可以是指定组件的高度,以font选项指定的字体的字符高度为单位,至少为指定组件中显示的图像,如果设置了imagetext、中对齐)或RIGHT(右对齐)这三个值Tk_GctPixelsTk_GctPixels3DRAISED、SUNKEN、FLAT比如RAISED表示组件内部相对于外部凸起指定组件在选中状态下的背景色指定组在选中状态下的前指定组件的当前状态。该选项支持NOMAL(正常)、DISAL(禁用)这两个值1表示接收焦点;设为0表示不接收焦点指定组件上显示的文本,文本显示格式由组件本身、anchor及justify选示格式由组件本身、anchor及justify选项决定指定为组件文本的第几个字符添加下画线,该选项就相当于为组件绑定了快捷键font对于能支持字符换行的组件,该选项指定每行显示的最大字符数,超过数量的字符将会转到下行通常用于将组件的水平滚动改变(包括内容滚动或宽度发生改变)与水平滚动条的et方法关联,从而让组件的水平滚动改变传递到水平滚动条通常用于将组件的垂直滚动改变(包括内容滚动或高度发生改变)与垂直滚动条的et方法关联,从而让组件的垂直滚动改变传递到垂直滚动条Butt(按钮用来执行用户的单击操作。Buttn可以包含文本,也可以包含图像。按钮被单击后会自动调用对应事件绑定的方法。"""测试Button组件的基本用法,使用面向对象的"""测试Button组件的基本用法,使用面向对象的fromtkinterimportfromtkinterimportmessageboxclassApplication(Frame):definit(self,super().init(master) self.master=masterdef"""self.btn01Button(root,text="登录globalphoto=PhotoImage(file="imgs/start.gif")self.btn02=Button(root,self.btn02.config(state="disabled")#defifname=='main':root=Tk()app=Application(master=root)运行结果Entry单行文本Entry用来接收一行字符串的控件。如果用户输入的文字长度长于Entry控件的宽度时,文字会自后滚动。如果想输入多行文本,需要使用Text控件。"""测试Entry组件的基本用法,使用面向对象的"""测试Entry组件的基本用法,使用面向对象的fromtkinterimportfromtkinterimportclass init(self,super().init(master) self.master=masterdef"""创建登录界面self.label01Label(self,text="用户名#StringVar变量绑定#StringVar变量的值发生变化,组件内容也变化;#组件内容发生变化,StringVar变量的值也发生v1=self.entry01=Entry(self,textvariable=v1)#创 self.label02=Label(self,text=" v2=deflogin(self):username=self.entry01.get()pwd=self.entry02.get() ifusername=="gaoqi"and ifname=='main':root=Tk()app=Application(master=root)界面效果Text多行文本Text(多行文本框)的主要用于显示多行文本,还可以显示网页,,ML面,甚至CSS件等。因此,也常被当做简单的文本处理器、文本编辑器或者网页浏览器来使用。比如IDEText组件构成的。"""测试Text多行文本框组件的基本用法,使用面fromtkinterimport*importwebbrowserclass"""测试Text多行文本框组件的基本用法,使用面fromtkinterimport*importwebbrowserclass init(self,super().init(master) self.master=defself.w1=Text(root,width=40,#宽度20(10)self.w1.insert(1.0,"粒粒皆辛苦def#INSERT索引表示在光标处插入self.w1.insert(INSERT,Gaoqi#END索引号表示在最后插入self.w1.insert(END,'[sxt]')self.w1.insert(1.8,def :行号以1开始列号以0,def#globalself.photo=PhotoImage(file="imgs/logo.gif")self.w1.image_create(END,image=self.photo)defb1Button(self.w1,text='爱尚学堂#在text创建组 deftestTag(self):尚学堂\n百战程序员\n self.w1.tag_add("good",1.0,1.9)self.w1.tag_config("good",background="yellow",self.w1.tag_add("baidu",4.0,4.2)self.w1.tag_config("baidu",underline=True)self.w1.tag_bind("baidu","<Button-1>",defdefifname=='main':root=Tk()app=Application(master=root)运行结果·利用TagsTagsText组件中内容的样式和功能。你可以修改文本的字体、尺寸和颜色。另外,Tags还允许你【示例】利用Tagfromtkinterimportimportroot=w1w1 w1.insert(INSERT,"goodgoodstudy,dayday尚学堂defw1.tag_bind("baidu","<Button-运行结果点击“”后,系统默认浏览器打开页面Radiobutton 单选 控件用于选择同一组单选按钮中的一个 可以显示文本,也可以显示图像"""测试Radiobutton组件的基本用法,使用"""测试Radiobutton组件的基本用法,使用面向fromtkinterimportfromtkinterimportclassdefdefinit(self,super().init(master) self.master=defcreateWidget(self):self.v=StringVar();self.r1=Radiobutton(self,text="",self.r2Radiobutton(selftext="女性"Button(self,text="确定",defconfirm(self):别ifname=='main':root=Tk()app=运行结果Checkbutton Checkbutton控件用于选择多个按钮的情况。Checkbutton"""测试Checkbutton"""测试Checkbutton组件的基本用法,使用面向fromtkinterimportfromtkinterimportmessageboxclassApplication(Frame): init(self,super().init(master) self.master=masterdefcreateWidget(self):self.codeHobby=IntVar(); Hobby=())self.c1Checkbutton(selftext="敲代码onvalue=1,self.c2=Checkbutton(self,text=" onvalueonvalue=1,Button(self,text="确定",defifHobby.get()== ifself.codeHobby.get()==1:送给他尚学堂 充饥ifname=='main':root=Tk()app=Application(master=root)运行结果canvas画组件等。本节我们简单介绍canvas的使用,更加详细和深"""测试Canvas"""测试Canvas组件的基本用法,使用面向对象的fromtkinterimportfromtkinterimportmessageboximportrandomclass init(self,super().init(master) self.master=masterdefself.canvas=Canvas(self,width=300,height=200,#画一#画一个rectself.canvas.create_rectangle(5050100,100)#画一.坐标两双。为椭圆的边界矩形左上角和底部右下角oval=self.canvas.create_oval(50,50,100,100)globalphoto=Button(self,text="画10个矩形",defforiinrange(0,10):x1=y1=x2=x1+y2=y1+self.canvas.create_rectangle(x1,y1,x2,y2) =='main':root=Tk()app=Application(master=root)运行结果一个GUI应用程序必然有大量的组件,这些组件如何排织、管理在父组件中子组件的布局方式。tkinter提供了三种管grid布局管理grid行和列的单元格来确定,并且可以跨行和跨列,从而实现复杂的布局。grid()方法提供ipadx,设置子组件之间的间隔x方向或者y方向,padx,与之并列的组件之间的间隔,x方向或者西北中以及4个角“n”,“s”,“w”,“e”, 【示例】 布局用法-登录界面设"""测试Grid布局管理器的基本用法,使用面向对fromtkinterimportfromtkinterimportmessageboximportrandomclass init(self,super().init(master) self.master=masterdef"""通过grid布局实现登录界"""self.label01Label(self,text="用户名")self.entry01=Entry(self) Label(self,text=" ").grid(row=1,column=0)Entry(self,show="*").grid(row=1,column=1)Button(self,text="登录").grid(row=2,column=1,Button(self,text="取消").grid(row=2,column=2, =='main':root=Tk()app=Application(master=root)运行结果【示例】通过 布局-实现计算器软件界面面,相应的功能暂不需要实现。74列的表格布局,然后""""""计算器软件界面的设计fromtkinterimportfromtkinterimportmessageboximportrandomclassdefinit(self,super().init(master) self.master=masterdef"""通过grid布局实现计算器的界面 ext=(("MC","M+","M- forrindex,rinforcindex,cinenumerate(r):ifc=="=":elifc==0:elifc==".":ifname=='main':root=Tk()app=Application(master=root)pack布局管理pck按照组件的创建顺序将子组件添加到父组件中,按照垂直或者水平的方向自然排布。如果不指定任何选项,默认在父组件中自顶向下垂直添加组件。pack是代码量最少,最简单的一种,可以用于快速界面pack()方法提供的选名描取值范当值为“yes”时,side选项无效。组件显示在父配件中心位置;若选项为”both”,则填充父组件的剩余“yes”,自然数,”no”,0(默认值或填充x(y)方向上的空间,当属性side=”top”或”bottom”时,填充方向;当属性side=”left”或”right”时,填充”y”方向;当expand选“x”,“y”,(默认值为设置子组件之间的间隔,x方向或者y方向,默认单位为像非负浮点数,默认非负浮点数,默认定义停靠在父组件的哪一边(默认为将本组件于所选组建对象之前pack,类似于先创建本组件再创建选组已经pack后的组件对将本组件于所选组建对象之后pack,类似于先创建选定组件再本组已经pack后的组件对将本组件作为所选组建对象的子组件,类似于指定本组件的为选已经pack后的组件对对齐方式,左对齐”w”,右对齐”e”,顶对齐”n”,底对齐“n”,“s”,“w”,“e”,“nw”,“se”,“ne”,“center”(默认【老鸟建议】如上列出了pack布局所有的属性,但是不需平排布,如果需要复杂的布局可以使用grid或place。【示例】pack布局用法,制作钢琴按键fromtkinter root=f2= fortxtinforforiinButton(f2,width=5,height=10,bg="black"ifi%2==0elseplace布局管理place布局管理器可以通过坐标精确控制组件的位置,适用place()方法的选relx是相对父组件的位置。0是最左边,0.5是正中间,1是最右边rely是相对父组件的位置。0是最上边,0.5是正中间,1是最下边与relx、rely取值类似,但是相对于“n”,“s”,“w”,“e”,“nw”,“sw”,“se”,“ne”,“center”(默认fromtkinterimportroot=root.title(fromtkinterimportroot=root.title("布局管理f1=Button(root,text="尚学运行结果【示例】place布局管理-牌游戏牌游戏的界面设计fromtkinterimportclassdefinit(self,super().init(master) self.master=def#self.photo=牌位置控制#self.puke1=Label(self.master,image=self.photo)#self.puke1.place(x=10,y=50)self.photos=self.pukes=[Label(self.master,image=self.photos[i])foriinforiinrange(10):#为所有的Label)defchupai(self,event):ifevent.widget.winfo_y()==50:ifname=='main':root=Tk()app=Application(master=root)一个GUI应用整个生命周期都处在一个消息循环(eventloop)中。它等待事件的发生,并作出相应的处理。Tkinter提供了用以处理相关事件的机制.处理函数可被绑widget.bind(event,如果相关事件发生handler函数会被触发,事件对象event会传递给handler函数鼠标和键盘事代说鼠标左键按下 鼠标左键释<B1-鼠标指针进入某一组件区鼠标指针离开某一组件区<KeyPress-a<KeyPress-A键(同时按下alt和a;alt可用ctrlshiftCTRLV键被同时按下,Vevent对象常用属名说按键字符,仅对键盘事按键编码,仅对键盘事键的char:键的 键的键的 键的 键的鼠标按键,仅对鼠标事所触发的事件类引起事件的组组件改变后的大小,仅Configure有鼠标当前位置,相对于鼠标当前位置,相对于整个屏#coding=utf-#测试键盘fromtkinterimport#coding=utf-#测试键盘fromtkinterimportroot=c1=Canvas(root,width=200,height=200,bg="green")defdeftestDrag(event):defdefpress_a_test(event):print("pressa")defrelease_a_test(event):print("releasea")lambda表达式详lambda表达式定义的是一个函数,只适合简单输入参lambda定义的函数也有输入、也有输出,只是没有名lambda参数值列表即为输表达式计算的结构即为输add3argslambdax,y,z:x+y+z上面的lambdadefreturn 表达式的参数值列表可以为如下lambda说xy函数没有输入参数,输出 函数没有输入参数,输出 aaa(3,4)的果 输入是任意个数的参数,输出是它们的**kwargs:输入是任意键值对参数,输出 我们在平时使用时,注 只是一个函数(没名字的函数),功能不强,不要过使用lambda表达式实现传#coding=utf-#测试#coding=utf-#测试command属性绑定事件,测试lambda表达fromtkinterimportroot=defdefmouseTest2(a,b):Button(root,text="测试command1",Button(root,text="测试command2",command=lambdamouseTest2("gaoqi",·组件对象的绑定通过command属性绑定(适合简单不需获取event对象Button(root,text=”登录通过bind()方法绑定(适合需要获取 对象c1=Canvas();c1.bind(“<Button-·组件类的绑定调用对象的bind_class函数,将该组件类所有的组件绑定事件比如:btn01.bind_class(“Button”,”<Button-#coding=utf-#多种事from#coding=utf-#多种事fromtkinterimportroot=defdefmouseTest2(a,b):print("a={0},b={1}".format(a,b))defb1Button(root,text="bind()绑定")#bind方式绑#command属性直接b2Button(roottext="command=lambda:mouseTest2("gaoqi","xixi"))#给所有Button按钮都绑定右<Button-b1.bind_class("Button","<Button-2>",其他组我们面介绍了最常用的几个组件,接下来我们介绍其他 选择 (选择项)用来做多选一,选中的在顶部显示。 fromtkinter root=Tk();root.geometry("200x100") fromtkinter root=Tk();root.geometry("200x100")v=StringVar(root);v.set("百战程序om (root,v,"尚学堂","百战程序员","卓越班[保18 值运行结果Scale移动Scale(移动滑块)用于在指定的数值区间,通过滑块的移选择值 fromtkinter root fromtkinter root=defprint("滑块的值:",value)newFont"宋体",value)s1=a=Label(root,a=Label(root,text="百战程序员运行结果颜色选择颜色选择框可以帮助我们设置背景色、前景色、画笔颜色、字体颜色等等。fromtkinter fromtkinter.colorchooserimport*root=Tk();root.geometry("400x150")defs1=askcolor(color="red",title="选择背景色 运行结果文件文件框帮助我们实现可视化的操作、操作文件。最后,将文件、的信息传入到程序中。文件框包含如函数框说文件返回打开的文件返回打开的多个文件名列返回打开的文件对象返回打开的文件对象的列)框返 保存返回保存的文件对象返回保存的文件参数说举默认后文件显示过滤初初始文父窗口,默认口窗口标fromfromtkinter fromtkinter.filedialogimportroot=deffaskopenfilename(title=show=运行结果fromtkinterfromtkinter fromtkinter.filedialogimportroot=defwithaskopenfile(title="上传文initialdir="d:",filetypes=[("文本",".txt")])asshow=简单输入simpledialog(简单框)包含如下常用函数函数说输入并返回浮点输入并返回整输入并返回字符kw为各种选项:initialvalue(初始值minvalue(最小值、 fromtkinter fromtkinter fromtkinter.simpledialogimportroot=show=aaskinteger(title= 自运行结果自通用消息点击确定、取消。如下列出了messagebox的常见函数:函数说例话Yes/No问题框问题错误消息对消息警告消息 fromtkinter fromtkinter from
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学校早餐供应合同范例
- 单位安装空调劳动合同范例
- 上海劳务合同范例
- 多式联运合同范例
- 道路置换合同范例
- 代持合同范例
- 业主终止合同范例
- 婚期转让酒店合同范例
- 安全用电十不准
- 机床改造维修行业深度研究报告
- 天津市勘察设计院集团有限公司招聘笔试题库2024
- 4.4 对数函数(精练)(解析版)-人教版高中数学精讲精练必修一
- 2024年秋季学期新湘教版七年级上册数学课件 第4章 图形的认识 4.1 立体图形与平面图形
- 天翼云高级解决方案架构师认证资格考试题库及答案
- 项目学习主题活动(二) 天宫空间站轨道长度变了多少
- 2024人形机器人产业半年研究报告
- 行道树的选择标准(2023年甘肃中考语文试卷说明文阅读题及答案)
- 2024届广东省广州市高三上学期调研测试数学试题及答案
- 《中国近现代史纲要》课程教学大纲
- Unit 4 Fun in the sun Reading for writing 教学设计 2024-2025学年仁爱版英语七年级上册
- 中国近代史(1840~1949年)大事年表知识清单
评论
0/150
提交评论