Python GUI 编程(Tkinter 和Python 编程)
Tkinter 和Python 编程
本节首先会介绍通用的GUI 编程,然后会重点关注如何使用Tkinter 及其组件创建Python
的GUI 程序。
Tkinter 模块:添加Tk 到应用中
那么为了让Tkinter 成为应用的一部分,你需要做些什么呢?首先,已经存在的应用并不
是必需的。如果你愿意,可以创建一个纯GUI 程序,不过没有让人感兴趣的底层功能的程序
不会有什么用处。
让GUI 程序启动和运行起来需要以下5 个主要步骤。
- 1.导入Tkinter 模块(或from Tkinter import *)。
- 2.创建一个顶层窗口对象,用于容纳整个GUI 应用。
- 3.在顶层窗口对象之上(或者“其中”)构建所有的GUI 组件(及其功能)。
- 4.通过底层的应用代码将这些GUI 组件连接起来。
- 5.进入主事件循环。
第一步是琐碎的:所有使用Tkinter 的GUI 程序都必须导入Tkinter 模块。获得Tkinter
的访问权是首要步骤(参见5.1.2 节)。
GUI 编程介绍
在举例之前,先简单介绍GUI 应用开发。这将为你今后的学习提供一些通用的背景知识。
创建一个GUI 应用就像艺术家作画一样。传统上,艺术家使用单一的画布开展创作。
其工作方式如下:首先会从一块干净的石板开始,这相当于用来构建其余组件的顶层窗口
对象。可以将其想象为房屋的地基或艺术家的画架。换句话说,必须在浇灌好混凝土或搭
建起画架之后,才能把真实的结构或画布拼装在上面。在Tkinter 中,这个基础称为顶层
窗口对象。
窗口和控件
在GUI 编程中,顶层的根窗口对象包含组成GUI 应用的所有小窗口对象。它们可能是
文字标签、按钮、列表框等。这些独立的GUI 组件称为控件。所以当我们说创建一个顶层窗
口时,只是表示需要一个地方来摆放所有的控件。在Python 中,一般会写成如下语句。
to p = Tkinter.Tk() # or just Tk() with "from Tkinter import *"
Tkinter.Tk()返回的对象通常称为根窗口,这也是一些应用使用root 而不是top 来指代它
的原因。顶层窗口是那些在应用中独立显示的部分。GUI 程序中可以有多个顶层窗口,但是
其中只能有一个是根窗口。可以选择先把控件全部设计好,再添加功能;也可以边设计控件
边添加功能(这意味着上述步骤中的第3 步和第4 步会混合起来做)。
控件可以独立存在,也可以作为容器存在。如果一个控件包含其他控件,就可以将其认
为是那些控件的父控件。相应地,如果一个控件被其他控件包含,则将其认为是那个控件的子控件,而父控件就是下一个直接包围它的容器控件。
通常,控件有一些相关的行为,比如按下按钮、将文本写入文本框等。这些用户行为称
为事件,而GUI 对这类事件的响应称为回调。
事件驱动处理
事件驱动的GUI 处理本质上非常适合于客户端/服务端架构。当启动一个GUI 应用时,
需要一些启动步骤来准备核心部分的执行,就像网络服务器启动时必须先分配套接字并将其
绑定到本地地址上一样。GUI 应用必须先创建所有的GUI 组件,然后将它们绘制在屏幕上。
这是布局管理器(geometry manager)的职责所在(稍后会详细介绍)。当布局管理器排列好
所有控件(包括顶层窗口)后,GUI 应用进入其类似服务器的无限循环。这个循环会一直运
行,直到出现GUI 事件,进行处理,然后再等待更多的事件去处理。
布局管理器
Tk 有3 种布局管理器来帮助控件集进行定位。最原始的一种称为Placer。它的做法
非常直接:你提供控件的大小和摆放位置,然后管理器就会将其摆放好。问题是你必须对
所有控件进行这些操作,这样就会加重编程开发者的负担,因为这些操作本应该是自动完
成的。
第二种布局管理器会是你主要使用的,它叫做Packer,这个命名十分恰当,因为它会把
控件填充到正确的位置(即指定的父控件中),然后对于之后的每个控件,会去寻找剩余的空
间进行填充。这个处理很像是旅行时往行李箱中填充行李的过程。
第三种布局管理器是Grid。你可以基于网格坐标,使用Grid 来指定GUI 控件的放置。
Grid 会在它们的网格位置上渲染GUI 应用中的每个对象。本章将使用Packer。
一旦Packer 确定好所有控件的大小和对齐方式,它就会在屏幕上将其放置妥当。
当所有控件摆放好后,可以让应用进入前述的无限主循环中。在Tkinter 中,代码如下
所示。
Tk inter.mainloop()
一般这是程序运行的最后一段代码。当进入主循环后,GUI 就从这里开始接管程序的执行。所有其他行为都会通过回调来处理,甚至包括退出应用。当选择File 菜单并单击Exit 菜
单选项,或者直接关闭窗口时,就会调用一个回调函数来结束这个GUI 应用。
顶层窗口:Tkinter.Tk()
之前提到过所有主要控件都是构建在顶层窗口对象之上的。该对象在Tkinter 中使用Tk
类进行创建,然后进行如下实例化:
>>> import Tkinter
>> > top = Tkinter.Tk()
在这个窗口中,可以放置独立的控件,也可以将多个组件拼凑在一起来构成GUI 程序。
那么有哪些种类的控件呢?现在就介绍这些Tk 控件。
Tk 控件
在本书写作时,总共有18 种Tk 控件,表5-1 所示为这些控件的描述。最新的控件有
LabelFrame、PanedWindow 和Spinbox,这些都是从Python 2.3 版本开始增加的(通过Tk 8.4)
| 控件 | 描述 |
|---|---|
| Button | 与 Label 类似,但提供额外的功能,如鼠标悬浮、按下、释放以及键盘活动/事件 |
| Canvas | 提供绘制形状的功能(线段、椭圆、多边形、矩形),可以包含图像或位图 |
| Checkbutton | 一组选框,可以勾选其中的任意个(与 HTML 的 checkbox 输入类似) |
| Entry | 单行文本框,用于收集键盘输入(与 HTML 的文本输入类似) |
| Frame | 包含其他控件的纯容器 |
| Label | 用于包含文本或图像 |
| LabelFrame | 标签和框架的组合,拥有额外的标签属性 |
| Listbox | 给用户显示一个选项列表来进行选择 |
| Menu | 按下 Menubutton 后弹出的选项列表,用户可以从中选择 |
| Menubutton | 用于包含菜单(下拉、级联等) |
| Message | 消息。与 Label 类似,不过可以显示成多行 |
| PanedWindow | 一个可以控制其他控件在其中摆放的容器控件 |
| Radiobutton | 一组按钮,其中只有一个可以“按下”(与 HTML 的 radio 输入类似) |
| Scale | 线性“滑块”控件,根据已设定的起始值和终止值,给出当前设定的精确值 |
| Scrollbar | 为 Text、Canvas、Listbox、Enter 等支持的控件提供滚动功能 |
| Spinbox | Entry 和 Button 的组合,允许对值进行调整 |
| Text | 多行文本框,用于收集(或显示)用户输入的文本(与 HTML 的 textarea 类似) |
| Toplevel | 与 Frame 类似,不过它提供了一个单独的窗口容器 |
我们将不会对Tk 控件进行详细介绍,因为已经有很多不错的文档可以供你参阅了,比
如Python 主站上的Tkinter 主题页,或大量印刷资源和网上关于Tcl/Tk 的资源(可以参见附
录B)。不过,后面会给出几个简单的例子来帮助你起步。
更多推荐

所有评论(0)