2020/3/151Python语言编程导论第十章Python的GUI编程张晋连2016.11内容提要•概述•GUI程序开发简介•Tkinter与主要组件•Turtle库简介2020/3/152一、概述•使用图形用户界面(GUI),可以使程序更友好。•Python作为一种“胶水性”语言,提供了众多GUI开发库的绑定,适合快速开发GUI。•目前大部分开发库还不支持Python3,且库的更新速度不是很快。如果使用的是Python3,可选择的开发库就不是很多了。•目前常用的开发库有:Python内置的Tkinter、Graphics、Turtle等,以及非常强大的PyQT等。如果使用的是Python2,还有如wxPython、PyGTK、PMW等开发库可以选择。2020/3/153本章简要介绍以下图形库:•Tkinter—Python标准GUI•Turtle—python内置的图形库。2020/3/154二、GUI程序开发简介•日常使用的大量客户端程序都属于GUI程序,即在一个界面上有很多功能块,包括:标签、按钮、输入框、菜单等。•开发GUI程序,首先需要有一块空白画面,然后在其上划分出不同的区域,放上不同的模块,最后完成每一个模块的功能。2020/3/155GUI程序开发基本步骤和过程:•首先要有底层的根窗口对象,在其基础上创建一个个小窗口对象。每一个窗口都是一个容器,可将所需的组件置于其中。每种GUI开发库都拥有大量的组件,一个GUI程序就是由各种不同功能的组件组成的,而根窗口对象则包含了所有组件。•组件本身也可以作为一个容器,它可以包含其他组件,如下拉框。这种包含其他组件的称为父组件,反之,包含在其他组件中的组件称为子组件。这是一种相对的概念,对于有着多层包含的情况,某组件的父组件一般指的是直接包含它的组件。2020/3/1562020/3/157•构建出了GUI程序的每一个组件,只完成了程序的界面,但此时只能看不能用,需要给每一个组件添加对应的功能。•使用GUI程序时,会进行各种操作,如鼠标移动,按下或松开鼠标键,按下键盘按键等,这些操作称为事件。每个组件对应着一些行为,如在文本框中输入文本,单击按钮等,这些也称为事件。GUI程序启动的时候就一直监控这些事件,当某个事件发生的时候,就进行对应的处理并返回相应的结果。因此,GUI程序是由这一整套事件驱动的,这个过程称为事件驱动处理。2020/3/158•一个事件发生后,GUI程序捕获该事件、作出对应的处理并返回结果的过程称为回调。如计算器程序,单击了“=”按钮之后,便产生了一个事件,需要计算最终的结果,程序便开始对算式进行计算,返回最终结果并显示出来。这个计算并显示结果的过程即为回调。•当为程序需要的每一个事件都添加完相应的回调处理之后,整个GUI就完成了。三、Tkinter与主要组件•Tk是Python默认的工具集(即图形库),Tkinter是Tk的Python接口,通过Tkinter可以方便地调用Tk进行图形界面开发。•Tk与其他开发库相比,不是最强大的,模块工具也不是非常的丰富。但它非常简单,所提供的功能开发一般的应用也完全够用了,且能在大部分平台上运行。•Python自带的IDEL也是用Tkinter开发的。•Tkinter的不足之处是缺少合适的可视化界面设计工具,需要通过代码来完成窗口设计和元素布局。2020/3/1592020/3/1510•Tkinter中提供了较为丰富的控件,完全能满足基本的GUI程序的需求。•由于Tkinter模块已经在Python中内置,所以在使用之前,只需将其导入即可。•两种导入方式为:importtkinterastk—导入tkinter,但没引入任何组件,在使用时需要使用tk前缀,如需要引入按钮,则表示为:tk.Button。fromtkinterimport*—将tkinter中的所有组件一次性引入。1、在程序中使用Tkinter•利用Tkinter模块来引用Tk构建和运行GUI程序,通常需要5步:–导入Tkinter模块;–创建一个顶层窗口;–在顶层窗口的基础上构建所需要的GUI模块和功能;–将每一个模块与底层程序代码关联起来;–执行主循环。2020/3/1511Tkinter主要组件简介组件功能Button按钮。类似标签,但提供额外功能,如鼠标按下、释放及键盘操作事件Canvas画布。提供绘图功能(直线、椭圆、多边形、矩形),可以包含图形或位图Checkbutton选择按钮。一组方框,可以选择其中的任意个Radiobutton单选按钮。一组方框,其中只有一个可被选择Entry文本框。单行文字域,用来收集键盘输入Frame框架。包含其他组件的纯容器Label标签。用来显示文字或图片Listbox列表框。一个选项列表,用户可以从中选择Menu菜单。单击后弹出一个选项列表,用户可以从中选择Menubutton菜单按钮。用来包含菜单的组件(有下拉式、层叠式)Message消息框。类似于标签,但可以显示多行文本Scale进度条。线性“滑块”组件,可设定起始值和结束值,显示当前位置的精确值Scrollbar滚动条。对其支持的组件(文本域、画布、列表框、文本框)提供滚动功能Text文本域。多行文字区域,可用来收集(或显示)用户输入的文字Toplevel顶级。类似框架,但提供一个独立的窗口容器。12组件的共同属性:•dimensions:尺寸•colors:颜色•fonts:字体•anchors:锚•reliefstyles:浮雕式•bitmaps:显示位图•cursors:光标的外形•说明:每种组件还有其各自特有的属性2020/3/1513注意:•Tk使用了一种包管理器来管理所有的组件,当定义完组件之后,需要调用pack()方法来控制组件的显示方式,若不调用pack()方法,组件将不会显示。•在交互环境下,编写Tkinter测试代码时,运行过Tk()(创建顶层窗口的函数)之后即进入主循环,可以看到顶层窗口。而若是运行py文件,一定要调用mainloop()方法进入主循环,方可看到顶层窗口。2020/3/1514创建GUI应用程序窗口代码模板:2020/3/15152、顶层窗口•顶层窗口也称为根窗口。•顶层窗口实际上是一个普通窗口,包括一个标题栏和窗口管理器所提供的窗口装饰部分,如最大化按钮等。•在一个Tkinter开发的应用程序中,只需要创建一个顶层窗口即可,且此窗口的创建必须是在其他窗口创建之前。2020/3/1516例10-1:创建顶层窗口2020/3/1517执行结果:3、标签•标签组件可以用来显示图片和文本,通过在文本中添加换行符来控制换行,也可以通过控制组件的大小实现自动换行。•例10-2:使用标签(Label)编写一个程序,在程序主体中显示“HelloWorld!”。2020/3/1518程序及执行结果:2020/3/1519Label组件常用参数参数描述height组件的高度(所占行数)width组件的宽度(所占字符个数)fg前景字体颜色bg背景颜色justify多行文本的对齐方式,可选参数为:LEFT、CENTER、RIGHTpadx文本左右两侧的空格数(默认为1)pady文本上下两侧的空格数(默认为1)2020/3/1520增加了参数后的程序及执行结果:2020/3/15214、框架•框架(Frame)相对于其他组件而言,它只是个容器,因为它没有方法,但它可以捕获键盘和鼠标的事件来进行回调。•框架一般用作包含一组控件的主体,且可以定制外观。2020/3/1522例10-3:创建不同样式的框架2020/3/15235、按钮•按钮组件(Button)是tkinter最常用的图形组件之一,通过Button可以方便地与用户进行交互。•严格地说,按钮(Button)也可被看作标签,只是它可以捕获键盘和鼠标事件。•按钮可以禁用,禁用之后的按钮不能进行单击等任何操作。•如果将按钮放进TAB群中,就可以使用TAB键来进行跳转和定位。2020/3/1524例10-4:创建按钮示例2020/3/1525Button组件常用参数参数描述height组件的高度(所占行数)width组件的宽度(所占字符个数)fg前景字体颜色bg背景颜色activebackground按钮按下时的背景颜色activeforeground按钮按下时的前景颜色justify多行文本的对齐方式,可选参数为:LEFT、CENTER、RIGHTpadx文本左右两侧的空格数(默认为1)pady文本上下两侧的空格数(默认为1)state设置组件状态,默认为NORMAL,可设置为:DISABLED—禁用组件(必须大写)2020/3/1526增加了参数后的程序和执行结果:2020/3/1527按下“退出”按钮:6、输入框•一个GUI程序,接收用户的输入几乎是必不可少的。输入框(Entry)组件就是用来接收用户输入的最基本的组件。•可以为输入框设置默认值,也可以禁止用户输入。如果禁止输入,用户就不能改变输入框中的值了。•当用户输入的内容一行显示不下的时候,输入框会自动生成滚动条。2020/3/1528例10-5:创建输入框示例2020/3/1529Entry参数组件常用参数参数描述height组件的高度(所占行数)width组件的宽度(所占字符个数)fg前景字体颜色bg背景颜色show将Entry框中的文本替换为指定字符,用于输入密码等,如设置show=*state设置组件状态,默认为NORMAL,可设置为:DISABLED—禁用组件,READONLY—只读2020/3/1530例10-6:将摄氏度转换为华氏度2020/3/1531程序执行:2020/3/15327、单选按钮•单选按钮(Radiobutton)是一组排他性的选择框,只能从该组中选择一个选项,当选择了其中一项之后便会取消其他选项的选择。•要想使用单选按钮,必须将这一组单选按钮与一个相同的变量关联起来,由用户为这个变量选择不同的值。2020/3/1533例10-7:创建单选按钮示例2020/3/1534Radiobutton组件常用参数参数描述variable单选按钮索引变量,通过变量的值确定哪个单选按钮被选中。一组单选按钮使用同一个索引变量value单选按钮选中时变量的值command单选按钮选中时执行的命令(函数)2020/3/15358、复选按钮•与单选按钮相对的是复选按钮(Checkbutton)。复选按钮之间没有互斥作用,可以一次选择多个。•同样地,每一个按钮都需要与一个变量相关联,且每一个复选按钮关联的变量都是不同的。若像单选按钮一样,关联的是同一个按钮,则当选中其中一个的时候,会将所有按钮都选上。•可以给每一个复选按钮绑定一个回调,当该选项被选中时,执行该回调。2020/3/1536例10-8:基本复选按钮示例2020/3/1537例10-9:创建带“禁用”状态的复选按钮2020/3/1538Checkbutton组件常用参数参数描述variable复选按钮索引变量,通过变量的值确定哪些复选按钮被选中。每个复选按钮使用不同的变量,使复选按钮之间相互独立onvalue复选按钮选中(有效)时变量的值offvalue复选按钮未选中(无效)时变量的值command复选按钮选中时执行的命令(函数)2020/3/1539例10-10:单选按钮及复选按钮综合应用2020/3/1540程序:2020/3/15412020/3/1542说明:•程序中,文字的颜色通过Radiobutton来选择,同一时间只能选择一个颜色。在三个Red、Blue和Green三个单选框中,定义了同样的变量参数color,选择不同的单选按钮会为该变量赋予不同的字符串值,内容即为对应的颜色。•任何单选按钮被选中都会触发colorChecked()函数,将标签修改为对应单选框表示的颜色。2020/3/15439、消息•很多时候需要给用户发送消息,一般内容较多,如帮助信息等。•消息(Message)控件提供了显示多行文本的方法,且可以设置字体