《Python基础案例教程》(微课版)第7章 Python图形界面张小龙第7章 Python图形界面图形用户界面,Graphical U ser Interface,简称为GUI。其实我们一直都在使用GUI,Windows窗口是GUI,IDLE也是GUI。任何一个商品 化的软件都需要有用户界面,它可以让用户方便操作软件。Python提供了多个图形开发界面的库,如wxPython、Qt、tkinte r等等。tkinter是Python的标准GUI开发工具包。本章以tkinter应用为基础,开发我们自己的GUI。教学内容01 初识图形界面02 搭建图形界面目录CONTENTS第7章 Python图形界面03 控制图形界面第7章 Python图形界 面前面Python语言编写的程序运行结果,基本只是以文字的形式输出,形式相对单一,不便于使用。给程序添加图形界面,除了便于用户使用 外,还可丰富程序结果的输出形式。为了编写程序图形界面,需要先认识图形界面的基本构成,然后设置图形界面接口。7.1 初识图形界面案 例介绍7.1.1 认识图形界面构成案例1 加法计算器图7.1 “加法计算器”运行效果案例准备7.1.1 认识图形界面构成加法计 算器实现的功能,是在两个文本框中分别输入两个加数后,单击“计算结果”按钮,计算结果会显示在最后一个文本框内。需要注意的是,两个加数 只能是数字,若输入其他字符无效。界面中还包含有其他元素,如提示用的文本、加号、等号等,这些元素其实就是一个个控件(也可以称之为组件 或部件)。添加好控件并设置属性后,一个简单的加法计算器即可实现。案例准备7.1.1 认识图形界面构成案例准备7.1.1 认识图形界 面构成使用tkinter库创建GUI流程:创建主窗口:导入tkinter库后,创建主窗口,root = Tk(),其中root是自 定义的一个主窗口对象。创建若干个控件:创建对象并设置属性,格式为:控件对象 = 控件(root,控件参数设置),控件也可以添加到其 他的自定义窗口对象中。显示控件:显示控件,格式为:控件对象.pack(),pack()方法是窗口布局的一种显示方法,还有另外2种方 法,grid()和place()。持续显示主窗口:通过调用mainloop()方法开启窗口。案例实施7.1.1 认识图形界面构成案 例实施7.1.1 认识图形界面构成案例实施7.1.1 认识图形界面构成案例实施7.1.1 认识图形界面构成案例实施7.1.1 认识 图形界面构成案例实施7.1.1 认识图形界面构成拓展阅读7.1.1 认识图形界面构成在图形界面程序中,所有控件如按钮、文本框等均在 主窗口上显示,因此在创建各部件之前需要先创建主窗口。若程序没有定义Tk,系统将自动创建。tkinter库提供了各种用于构建图形界面 的控件,如文本框、标签、按钮等,以此来实现不同功能。表7.1列出了tkinter库一些常见的控件。案例介绍7.1.2 创建图形窗口 案例2 我的第一个GUI程序创建一个标题为“我的第一个GUI程序”,大小为300x160的空白窗口案例准备7.1.2 创建图形窗 口根据使用tkinter库创建GUI程序流程,先要导入tkinter库,创建主窗口,设定窗口的标题栏,设定窗口大小。由于是空白窗口 ,不需要添加其他控件,最后持续显示窗口。案例准备7.1.2 创建图形窗口案例准备7.1.2 创建图形窗口(1)窗口常见属性的设置窗 口常见的属性有窗口标题、图标、背景颜色、是否可更改窗口的大小、窗口的透明度等等。常见设置窗口属性相关的方法。表7.2 窗口常见的 属性设置案例准备7.1.2 创建图形窗口创建对象时,指定属性值。格式如下:创建控件对象后,使用属性名来分别指定各属性值。格式如下: 创建控件对象后,使用configure或者config方法来指定属性值。格式如下:(2)控件属性设置的方法tkinter中进行控件 属性的设置方法有三种:案例实施7.1.2 创建图形窗口案例实施7.1.2 创建图形窗口运行程序,观察程序的执行结果。注意窗口大小为 300x160。尝试修改窗口大小,设置窗口标题。案例实施7.1.2 创建图形窗口拓展阅读7.1.2 创建图形窗口tkinter库是 Python默认的GUI库,调用前不需要PIP安装。调用tkinter库的编码方法有2种。方法二:格式:from tkinter import ,示例如下:方法一:格式:import tkinter as 自定义窗体名,示例如下:第7章 Python图形界 面认识了图形界面,可以像搭积木一样,搭建图形界面。搭建图形界面,就是在窗口中添加标签、文本、按钮、框架、列表、菜单等控件,并根据程 序的需要设置各控件的属性,来实现程序的功能,使程序更好的实现人机交互。7.2 搭建图形界面案例介绍7.2.1 标签与文本案例 3 展示古诗案例准备7.2.1 标签与文本展示古诗,其实就是在窗口中用合适的方式显示古诗相关的内容。先新建窗口,设置窗口属性 ,再添加控件显示古诗名、作者和古诗内容。案例准备7.2.1 标签与文本案例准备7.2.1 标签与文本(1)标签控件Labe lLabel控件可以用于在窗口内显示文字或图像。Label控件使用示例案例准备7.2.1 标签与文本Message控件使用示例 (2)消息控件MessageMessage的主要用途是显示短消息,功能与Label类似,比Label使用起来更灵活,可自动分行。案 例实施7.2.1 标签与文本案例实施7.2.1 标签与文本案例实施7.2.1 标签与文本通过观察程序执行的结果,发现窗 口中显示的文字字号较小,且4句古诗没有分行。拓展阅读7.2.1 标签与文本1.Label ( )方法常用的options参数设 置Label ( )方法的options参数,也称为Label标签的属性设置,较常用的属性如表所示。拓展阅读7.2.1 标签与 文本2.与文本相关的其他控件(1)文本框控件Entry文本框Entry,通常指单行的文本框,在GUI设计中用于输入文本,可以用它输 入单行字符串。(2)文字区域控件TextText可以看作是Entry控件的扩充,可以处理多行的输入,也可以在文字中插入图像或提供格 式化的功能。可以将Text当作简单的文字处理软件。案例介绍7.2.2 按钮与框架案例4 展示多首古诗案例3在窗口中展示了一首 古诗,并通过设置古诗的字体、字号等属性调整古诗的显示效果。但仅展示一首古诗是不够的。如图7.4所示,若想“展示多首古诗”,使用 “ 上一首”、“下一首”按钮控制查看所有的古诗,该如何实现呢?案例准备7.2.2 按钮与框架有多首古诗的时候,使用按钮来查看“上一 首”和“下一首”古诗。古诗内容可以保存在元组中。每一首古诗是元组的一个元素,包含古诗名、作者信息及古诗内容。单击“上一首”按钮后调 用对应函数实现上一首古诗的显示。若当前显示的古诗已经是第一首的时候,滚动显示最后一首诗,实现循环展示。单击“下一首”按钮同理。案例 准备7.2.2 按钮与框架案例准备7.2.2 按钮与框架(1)按钮控件Button的使用在程序中添加按钮控件,按钮上可以放 上文本或图像,可以与一个函数相关联,当按钮被按下后,自动调用该函数。使用格式如:btn = Button (父对象 , optio ns , ... )。当单击按钮时,标签组件Label显示字符串 “hello, Button”案例准备7.2.2 按钮与框架 (2)框架控件Frame的使用框架控件Frame,也称为容器控件。为了方便管理GUI程序中的控件,可以将其他多个控件,如按钮控件、 标签控件等组织在一个框架里。按钮和标签的参数里的父对象,设置成框架Frame控件即可。流程是先创建框架Frame,然后在框架里创建 其他控件。建立框架后,添加按钮到框架中。案例准备7.2.2 按钮与框架案例实施7.2.2 按钮与框架(1)新建窗体案例实施 7.2.2 按钮与框架(2)添加古诗用元组来定义古诗,每一个元素即为一首古诗,包括古诗名、作者信息、古诗内容。案例中添加了3首 古诗,可以添加更多的古诗实现更多古诗的展示。案例实施7.2.2 按钮与框架(3)创建框架创建2个框架分别用来容纳按钮和古诗内容 。定义list_gushi()函数,使用Message控件显示读取元组中的古诗内容(读取古诗内容后存放在变量text1和text2 中)。案例实施7.2.2 按钮与框架(4)定义按钮控制函数根据算法分析,定义prev_gushi()和next_gushi() 函数,分别对应单击“上一首”按钮和“下一首”按钮。单击按钮后将读取古诗元组中的数据。案例实施7.2.2 按钮与框架(5)初始化 变量,显示古诗新建变量num并赋初始值为0,即从第1首开始。定义text1和text2两个变量,对应存放“古诗名+作者”及“古诗内 容”。设置好初始值后,调用list_gushi ()函数显示古诗。案例实施7.2.2 按钮与框架(6)添加按钮控件添加“上一首 ”和“下一首”两个按钮,按钮置于框架Frame中,用来控制查看古诗。案例实施7.2.2 按钮与框架案例实施7.2.2 按钮 与框架程序中,框架控件Frame2虽然设置了高height和宽width两个参数,但当其他控件添加框架后,框架控件会改变自身大小, 即随着里面控件的大小变化。如何让框架控件按设置的高和宽显示呢?可以使用pack_propagate(0)方法来实现。为了给用户更多 的提示,可以使用标签框架控件LabelFrame。LabelFrame的用法和框架控件Frame相同。拓展阅读7.2.2 按钮 与框架1.建立含有图像的功能按钮按钮控件一般用文字作为按钮名称,也可以用图像当做按钮名称。若使用图像当做按钮,设置控件参数的时候可 以省略text参数的设置,但要增加image参数设置图像对象。拓展阅读7.2.2 按钮与框架2.标签框架控件LabelFram e特有属性框架控件(Frame和LabelFrame),都可以在屏幕上创建一块矩形区域,多作为容器来布局其他控件。比如标签、按钮、 输入框等,都可用框架来布局。LabelFrame 控件是 Frame 控件的变体。默认情况下,LabelFrame 会在其子控件的 周围绘制一个边框以及一个标题。标签框架控件LabelFrame比框架控件Frame多了如表7.4属性,都是跟标签有关。表7.4 LabelFrame常见的属性设置案例介绍7.2.3 列表与菜单案例5 用列表选择古诗案例4中用按钮来查看上一首和下一首古诗 ,用户只能看到当前古诗内容,不知道上一首和下一首是什么古诗。如图7.6所示,使用列表来选择古诗,可以很清晰的知道有哪些古诗,需要展 示古诗的时候,只要单击列表中对应的项就可以了。如何用列表选择古诗呢? 案例准备7.2.3 列表与菜单使用列表列举出古诗元组中的 每一个元素的古诗名,这样用户能够清晰的看出有多少首古诗。使用列表要先建立列表框项目,将古诗名(读取gushi元组中的内容)添加到列 表框项目,选中选项中的一首古诗后,会在窗口中显示对应古诗内容。列表框和古诗分别置于LabelFrame框架中。案例准备7.2.3 列表与菜单案例准备7.2.3 列表与菜单(1)列表控件ListboxListbox是以列表的形式来提供选项。当创建一个Li stbox控件时,它是空的,要先使用insert()方法添加文本。insert()方法有两个参数:第一个参数是插入的索引号,第二个 参数是插入的字符串。索引号通常是项目的序号(0是列表第一项的序号,END表示Listbox的最后一行。)建立一个列表并添加3个选项 。案例准备7.2.3 列表与菜单(2)菜单控件MenuMenu控件通常用于程序上的各种菜单,包括顶级菜单、下拉菜单和弹出菜单。 建立 “文件”菜单,然后内建立下拉式列表命令。案例实施7.2.3 列表与菜单(1)新建窗体,添加古诗用元组来定义古诗,每一个元 素即为一首古诗,包括古诗名、作者信息、古诗内容。案例中添加了3首古诗,可以添加更多的古诗实现更多古诗的展示。新建窗体,定义古诗元组 并添加古诗,代码同案例4。案例实施7.2.3 列表与菜单(2)新建列表,添加列表项目创建列表框Listbox控件,添加到Fra me1中。遍历gushi元组,读取每一条元素的第1个内容(索引值为0),即古诗名,插入到列表框。如果选中其中任意一项,在“古诗展示 ”对应显示该古诗。案例实施7.2.3 列表与菜单(3)添加菜单在主窗口root中添加“文件”菜单,然后在此菜单内建立“打开”和 “退出”命令列表。单击“退出”后程序退出。案例实施7.2.3 列表与菜单(4)显示古诗自定义变量text1和text2,用来保 存读取的元组中古诗内容。内容通过Message控件显示出来。案例实施7.2.3 列表与菜单案例实施7.2.3 列表与菜单拓 展阅读7.2.3 列表与菜单1.建立快捷菜单快捷菜单,在使用Windows系统的时候,在桌面上右击,会弹出一个菜单,这就是快捷 菜单。建立快捷菜单和建立菜单不同之处在于,建立好Menu对象后,可以直接利用此对象建立指令列表,最后再与鼠标右击操作绑定显示菜单。 如下示例弹出菜单,有三个子菜单,分别是添加、修改和退出。单击“添加”和 “修改”子菜单调用calltest()函数,单击“退出”后 结束关闭窗口。拓展阅读7.2.3 列表与菜单2.建立工具栏在图形界面设计中,除了将一系列命令组成菜单外,还可以将常用的命令组成 工具栏,放在窗口中方便用户随时调用,如Office系列软件的工具栏。tkinter没有提供类似模块,可以使用Frame控件在需要的 位置创建后,在Frame框架里添加一系列图形按钮实现建立工具栏。如下所示示例,在程序中建立了一个工具栏,工具栏内有2个图形按钮。单 击按钮后会执行对应的功能函数。第7章 Python图形界面窗口中添加了标签、按钮、列表、菜单等控件后,随着程序功能的扩充,可能还 会添加更多的控件,不仅要处理好控件相关的事件,还要对这些控件进行有布局管理,来给用户创造更好的操作体验。7.3 控制图形界面案例 介绍7.3.1 布局管理案例6 优化古诗展示布局案例准备7.3.1 布局管理 窗口的布局管理方式有3种方法,分别是 pack()、grid()和place()方法。古诗展示案例中用到了3个框架LabelFrame控件,根据窗口大小规划好控件的大小 。可以选用place()方法用坐标来定位框架的位置,这样布局后的效果会显得整齐划一。案例准备7.3.1 布局管理案例准备7.3 .1 布局管理(1)单控件布局单控件布局,主要用pack方法进行布局管理。了解了pack布局方法,就可以用来控制单个控件的位置 了。分析步骤基本为:明确当前容器的可用空间范围分析是用上下排列(side = TOP/BOTTOM),还是左右排列(side = LEFT/RIGHT)判断是否需要扩展空间,需要则设置expand = Yes设置anchor参数,确定控件的具体位置利用填充(f ill)对控件的可见区域进行填充案例准备7.3.1 布局管理(2)多控件布局实际的图形界面大多为多控件的综合布局,涉及到各个控 件之间的关系。多控件布局一般需要注意以下几点:所有控件布局定位,按代码的前后组织顺序布局设置side = TOP/BOTTON的控 件为上下排列的组件,需要独占整行设置side = LEFT/RIGHT的控件为左右排列的组件,需要独占整列可利用Frame的多层嵌 套,进行灵活布局案例实施7.3.1 布局管理(1)在gushi元组中添加“古诗注释”内容。(2)创建框架,布局方式为place 。分别建立3个LabelFrame框架,用来“选择古诗”、“古诗展示”和“古诗注释”。frame1的坐标为(10,30)、fram e2的坐标为(120,30)、frame3的坐标为(290,30)。案例实施7.3.1 布局管理(3)添加其他控件案例6和案例 5的区别是调整了框架控件的布局管理方式。其他控件的添加和属性设置、程序与案例5相同,可以直接使用案例5的控件及对应程序。案例实施7 .3.1 布局管理运行程序,查看程序执行的结果,注意观察各控件的位置是否合理。案例实施7.3.1 布局管理结合案例4,在窗 口中添加“上一首”和“下一首”按钮,实现同时用按钮也能查看古诗的目的。程序执行后的效果如图所示。拓展阅读7.3.1 布局管理1 .pack方法pack方法是按添加顺序排列组件,是最常使用的控件布局管理方法,前面的案例中已经用到这种布局方法。pack方法的语法 格式为:pack(options, ... ),其中options参数可以是side、fill、padx/pady、ipadx/i pady、anchor,其参数说明如表7.5所示。表7.5 pack方法的参数说明拓展阅读7.3.1 布局管理2.grid方 法grid布局方法是按行列形式排列组件,用表格的方式来包装和定位窗口中的组件。grid方法的语法格式为:grid(options , ...),其中options参数可以是row、column、padx/pady、rowspan、columnspan、stic ky,其参数说明如表7.6所示。表7.6 grid方法的参数说明拓展阅读7.3.1 布局管理3.place方法place方法 允许指定组件的大小和位置,是用直接指定方式将控件放在窗口中的方法。place方法的语法格式为:place(options , .. .),其中options参数可以是height/width、relx/rely、x/y、relheight/relwidth、bo rdermode、anchor,其参数说明如表7.7所示。表7.7 place方法的参数说明案例介绍7.3.2 事件处理案例 7 读取文件中的古诗前面案例中,用的是元组来保存需要展示的古诗内容。在实际应用中,添加和删除数据都需在程序中进行,比较麻烦。将数 据保存在文件中,读取文件中的数据,是比较灵活的方法。若将古诗内容保存在CSV格式文件中,如何读取CSV格式文件,来展示文件中的古诗 呢?案例准备7.3.2 事件处理本案例通过读取CSV格式文件中的古诗内容,在列表中展示出所有的古诗标题。单击选择列表中的选项后 ,在窗口中对应展示所选古诗的内容和注释。案例准备7.3.2 事件处理案例准备7.3.2 事件处理在Python的GUI程序 中,需要编写事件处理程序,该事件处理程序必须绑定后才能生效。常见的事件处理(绑定)有以下几类:(1)创建控件对象时指定创建控件时, 可以通过其command参数指定事件处理函数,如为btn1按钮控件绑定单击事件,当控件被单击时执行事件处理函数,单击按钮时执行Cl ick_btn1函数。案例准备7.3.2 事件处理(2)实例绑定调用控件对象实例方法bind,可以为指定控件实例绑定事件。格式 为:kj是事件的来源,可以是root窗口对象,也或是认识的控件,如按钮、选项等。为事件类型,handler为事件处理 函数。事件类型有键盘事件、鼠标事件、窗体事件等。案例实施7.3.2 事件处理(1)添加古诗内容本案例将古诗内容保存在CSV格式 的文件中。通过读取CSV格式文件,来展示文件中的古诗。CSV格式文件用Excel软件打开状态,如图所示。案例实施7.3.2 事 件处理(2)新建窗体,设置窗体属性设置窗口标题为“读取文件中的古诗”,设置窗口大小为(550x240),坐标(200,200),禁 止更改窗口尺寸。案例实施7.3.2 事件处理(3)自定义函数根据程序的需要,定义read_csv()函数用来读取CSV文件,定义printlist()函数用来绑定Listbox事件处理,定义list_gushi()函数用来显示古诗内容。案例实施7.3.2 事件处理(4)添加控件并设置新建多个Frame框架布局窗口。新建列表和垂直滚动条控件,用于显示所有古诗列表。案例实施7.3.2 事件处理(5)程序初始化显示古诗主程序执行流程是先提取CSV文件,显示古诗。根据界面布局设置,显示控件。案例实施7.3.2 事件处理运行程序后,用鼠标单击列表中的古诗选项,观察古诗展示区和古诗注释区显示内容的变化,案例7程序执行效果如图所示。案例实施7.3.2 事件处理结合前面所学给案例7添加“文件”和“关于”菜单,其中“文件”菜单的子菜单为“打开”和“退出”。当单击“退出”后关闭图形界面;当单击“关于”菜单后弹出软件介绍对话框。参考代码如下所示。拓展阅读7.3.2 事件处理1.鼠标绑定应用示例鼠标事件的基本应用,当在窗口中单击鼠标左键时,在Python Shell窗口中列出鼠标单击事件时的坐标。拓展阅读7.3.2 事件处理2.键盘绑定应用示例 键盘绑定事件的基本应用,程序在执行时,在Python Shell窗口中打印出所按a……z的键。使用repr()函数将参数处理成字符串。THANKS FOR WATCHING |
|