### 8.2.2 初识 Tkinter
Tkinter 模块中定义了许多构件类,利用这些构件类可以容易地创建构件实例,从而建立 图形界面。下面按字母顺序列出一些常用的构件类及其简要功能:
+ Button:按钮。用于执行命令。
+ Canvas:画布。用于绘图、定制构件。
+ Checkbutton:勾选钮。用于表示是否选择某个选项。
+ Entry:录入框。用于输入、编辑一行文本。
+ Frame:框架。是容器构件,用于构件组合与界面布局。
+ Label:标签。用于显示说明文字。
+ Listbox:列表框。用于显示若干选项。
+ Menu:菜单。用于创建下拉式菜单或弹出式菜单。
+ Message:消息。类似标签,但可显示多行文本。
+ Radiobutton:单选钮。用于从多个冲突选项中选择一个。
+ Scrollbar:滚动条。用于滚动显示更多内容。
+ Text:文本区。用于显示和编辑多行文本,支持嵌入图像。
+ Toplevel:顶层窗口。是容器构件,用于多窗口应用程序。
> ① 其他常用的 GUI 工具包有 wxPython,PyQt 等。
为了使用 Tkinter 中定义的构件类,需要先导入 Tkinter 模块。下面两种形式的 import 语 句都可以,一般来说后一种形式更方便。
```
import Tkinter
from Tkinter import *
```
首先看一个最简单的 Tkinter 程序:
【程序 8.1】eg8_1.py
```
from Tkinter import *
root = Tk()
root.mainloop()
```
程序 8.1 的第 1 行导入 Tkinter 模块。第 2 行调用 Tk 构造器,初始化 Tk 并自动创建一个 根窗口。根窗口的形状依赖于操作系统平台,一般都具有标题栏和最小化、最大化、关闭按 钮。每个程序必须有也只有一个根窗口,并且要先于其他构件创建①,其他构件都是根窗口 的子构件。第 3 行进入主循环,准备处理事件。除非用户关闭窗口,否则程序将一直处于主
循环中。注意:只有进入了主循环,根窗口才可见②。程序的执行结果如图 8.3 所示:
![](https://box.kancloud.cn/2016-02-22_56cafce4c6175.png)
图 8.3 程序 8.1 的执行结果
程序 8.1 只搭建了一个图形界面雏形,除了根窗口,界面中没有任何能与用户进行交互 的构件。下面这个程序略有改进,在窗口中添加了一个标签构件:
【程序 8.2】eg8_2.py
```
from Tkinter import *
root = Tk()
aLabel = Label(root, text="Hello World")
aLabel.pack()
root.mainloop()
```
程序 8.2 的第 3 行创建标签构件 aLabel,Label 构造器的第一个参数 root 表示该标签构件 是根窗口的子构件,第二个参数指定标签的文本内容。第 4 行表示用 Pack 布局管理器对标签 构件进行布局,这使得标签在根窗口中以紧凑的方式摆放。程序的执行效果如图 8.4 所示:
![](https://box.kancloud.cn/2016-02-22_56cafce4d631e.png)
![](img/程序设计思想与方法241920.png)
图 8.4 程序 8.2 的执行结果
大多数构件在创建之后并不会立即显示在窗口中,必须经由布局管理器进行布置之后才变成可见的,因此多数构件都要像上例中的标签构件一样经历创建和布局两个步骤。
> ① 事实上,如果程序没有显式创建根窗口而直接去创建其他构件,系统仍然会自动创建根窗口。
> ② 如果在命令行环境中交互式执行程序语句,窗口和其他构件无需进入主循环就能显示。
构件对象属性
每个构件都是对象,构造对象时设置的各种参数都是对象的属性(实例变量),如上例中 标签构件的 text 属性。Tkinter 构件一般都有许多属性,在用构造器创建构件实例时可以为一 些属性设置属性值,而没有设置的属性也都有预定义的缺省值。由于属性众多,又是有选择 地设置,所以创建实例时适合采用“命名参数”方式来传递属性值,即“属性=属性值”的 形式①。属性值如果是数值或单个字符,可以不用引号;如果是数值与字母混用,或者是字 符串,则必须用引号。
构件对象的属性值既可以在创建时指定,也可以在将来任何时候设置或修改。每种构件 类都提供 configure(或简写为 config)方法用于修改属性值。例如,如果在程序 8.2 中倒数 第 2 行处增加一条语句:
```
aLabel.config(text="Goodbye")
```
则执行程序后就会看到标签文本从“Hello World”变成了“Goodbye”。
Tkinter 还提供了另一种修改构件对象属性值的方法:将对象视为一个字典②,该字典以 属性名作为键,以属性值作为键值。按照修改字典键值的语法,上面这条语句可以写成:
```
aLabel["text"] = "Goodby"
```
用字典方法每次只能修改一个属性的值,而用 config 每次可以修改多个属性的值,例如 下面这条语句同时修改了标签的文本、前景色和背景色:
```
aLabel.config(text="Goodbye",fg="red",bg="blue")
```
根窗口的标题和大小
从图 8.3 和图 8.4 可见,根窗口默认的窗口标题是 Tk,如果对此不满意,可以通过调用 根窗口对象的 title 方法来设置窗口标题:
```
root.title("My GUI")
```
根窗口的默认大小是宽度和高度各为 200 像素,如果对此不满意,可以通过调用根窗口 对象的 geometry 方法来设置窗口大小。指定窗口尺寸的最简单形式是“宽度 x 高度”:
```
root.geometry("400x400")
```
父构件与子构件
如前所述,图形界面中的所有构件按父子关系构成了树状层次,构件之间的父子信息记录在每个构件都有的 master 和 children 属性中,Tkinter 会自动维护这两个属性的值。编程时, 可以利用这两个属性来从子构件找到其父构件,从而间接引用父构件。例如语句
```
aLabel.master.title("My GUI")
```
的意思是对标签构件 aLabel 的父构件(即 root)调用 title 方法来设置窗口标题。
图形界面中当然不会只有一个构件,仿照上面创建标签构件的过程,我们可以根据需要 创建多个构件并在窗口中布局,最终设计出复杂的图形界面。例如:
【程序 8.3】eg8_3.py
```
from Tkinter import *
root = Tk()
aLabel = Label(root,text="Hello World")
aLabel.pack()
aButton = Button(root,text="Click Me")
aButton.pack()
root.mainloop()
```
> ① 参见第 4 章关于函数参数传递的内容。
> ② 回顾第 6 章关于字典类型的介绍:字典就是“键-值”配对的集合。
程序 8.3 的第 3-6 行分别创建了一个标签和一个按钮构件,并在窗口中用 Pack 布局管 理器进行布局。执行结果如图 8.5 所示:
![](https://box.kancloud.cn/2016-02-22_56cafce4e7be5.png)
图 8.5 程序 8.3 的执行结果 通过以上几个简单例子可以看出,基于 Tkinter 的图形界面设计非常简单,可概括为创建
构件并在窗口中进行布局的过程。接下来我们就要具体学习各种图形构件的使用方法和布局 方法。
- 前言
- 第 1 章 计算与计算思维
- 1.1 什么是计算?
- 1.1.1 计算机与计算
- 1.1.2 计算机语言
- 1.1.3 算法
- 1.1.4 实现
- 1.2 什么是计算思维?
- 1.2.1 计算思维的基本原则
- 1.2.2 计算思维的具体例子
- 1.2.3 日常生活中的计算思维
- 1.2.4 计算思维对其他学科的影响
- 1.3 初识 Python
- 1.3.1 Python 简介
- 1.3.2 第一个程序
- 1.3.3 程序的执行方式
- 1.3.4 Python 语言的基本成分
- 1.4 程序排错
- 1.5 练习
- 第 2 章 用数据表示现实世界
- 2.1 数据和数据类型
- 2.1.1 数据是对现实的抽象
- 2.1.1 常量与变量
- 2.1.2 数据类型
- 2.1.3 Python 的动态类型*
- 2.2 数值类型
- 2.2.1 整数类型 int
- 2.2.2 长整数类型 long
- 2.2.3 浮点数类型 float
- 2.2.4 数学库模块 math
- 2.2.5 复数类型 complex*
- 2.3 字符串类型 str
- 2.3.1 字符串类型的字面值形式
- 2.3.2 字符串类型的操作
- 2.3.3 字符的机内表示
- 2.3.4 字符串类型与其他类型的转换
- 2.3.5 字符串库 string
- 2.4 布尔类型 bool
- 2.4.1 关系运算
- 2.4.2 逻辑运算
- 2.4.3 布尔代数运算定律*
- 2.4.4 Python 中真假的表示与计算*
- 2.5 列表和元组类型
- 2.5.1 列表类型 list
- 2.5.2 元组类型 tuple
- 2.6 数据的输入和输出
- 2.6.1 数据的输入
- 2.6.2 数据的输出
- 2.6.3 格式化输出
- 2.7 编程案例:查找问题
- 2.8 练习
- 第 3 章 数据处理的流程控制
- 3.1 顺序控制结构
- 3.2 分支控制结构
- 3.2.1 单分支结构
- 3.2.2 两路分支结构
- 3.2.3 多路分支结构
- 3.3 异常处理
- 3.3.1 传统的错误检测方法
- 3.3.2 传统错误检测方法的缺点
- 3.3.3 异常处理机制
- 3.4 循环控制结构
- 3.4.1 for 循环
- 3.4.2 while 循环
- 3.4.3 循环的非正常中断
- 3.4.4 嵌套循环
- 3.5 结构化程序设计
- 3.5.1 程序开发过程
- 3.5.2 结构化程序设计的基本内容
- 3.6 编程案例:如何求 n 个数据的最大值?
- 3.6.1 几种解题策略
- 3.6.2 经验总结
- 3.7 Python 布尔表达式用作控制结构*
- 3.8 练习
- 第 4 章 模块化编程
- 4.1 模块化编程基本概念
- 4.1.1 模块化设计概述
- 4.1.2 模块化编程
- 4.1.3 编程语言对模块化编程的支持
- 4.2 Python 语言中的函数
- 4.2.1 用函数减少重复代码 首先看一个简单的用字符画一棵树的程序:
- 4.2.2 用函数改善程序结构
- 4.2.3 用函数增强程序的通用性
- 4.2.4 小结:函数的定义与调用
- 4.2.5 变量的作用域
- 4.2.6 函数的返回值
- 4.3 自顶向下设计
- 4.3.1 顶层设计
- 4.3.2 第二层设计
- 4.3.3 第三层设计
- 4.3.4 第四层设计
- 4.3.5 自底向上实现与单元测试
- 4.3.6 开发过程小结
- 4.4 Python 模块*
- 4.4.1 模块的创建和使用
- 4.4.2 Python 程序架构
- 4.4.3 标准库模块
- 4.4.4 模块的有条件执行
- 4.5 练习
- 第 5 章 图形编程
- 5.1 概述
- 5.1.1 计算可视化
- 5.1.2 图形是复杂数据
- 5.1.3 用对象表示复杂数据
- 5.2 Tkinter 图形编程
- 5.2.1 导入模块及创建根窗口
- 5.2.2 创建画布
- 5.2.3 在画布上绘图
- 5.2.4 图形的事件处理
- 5.3 编程案例
- 5.3.1 统计图表
- 5.3.2 计算机动画
- 5.4 软件的层次化设计:一个案例
- 5.4.1 层次化体系结构
- 5.4.2 案例:图形库 graphics
- 5.4.3 graphics 与面向对象
- 5.5 练习
- 第 6 章 大量数据的表示和处理
- 6.1 概述
- 6.2 有序的数据集合体
- 6.2.1 字符串
- 6.2.2 列表
- 6.2.3 元组
- 6.3 无序的数据集合体
- 6.3.1 集合
- 6.3.2 字典
- 6.4 文件
- 6.4.1 文件的基本概念
- 6.4.2 文件操作
- 6.4.3 编程案例:文本文件分析
- 6.4.4 缓冲
- 6.4.5 二进制文件与随机存取*
- 6.5 几种高级数据结构*
- 6.5.1 链表
- 6.5.2 堆栈
- 6.5.3 队列
- 6.6 练习
- 第 7 章 面向对象思想与编程
- 7.1 数据与操作:两种观点
- 7.1.1 面向过程观点
- 7.1.2 面向对象观点
- 7.1.3 类是类型概念的发展
- 7.2 面向对象编程
- 7.2.1 类的定义
- 7.2.2 对象的创建
- 7.2.3 对象方法的调用
- 7.2.4 编程实例:模拟炮弹飞行
- 7.2.5 类与模块化
- 7.2.6 对象的集合体
- 7.3 超类与子类*
- 7.3.1 继承
- 7.3.2 覆写
- 7.3.3 多态性
- 7.4 面向对象设计*
- 7.5 练习
- 第 8 章 图形用户界面
- 8.1 图形用户界面概述
- 8.1.1 程序的用户界面
- 8.1.2 图形界面的组成
- 8.1.3 事件驱动
- 8.2 GUI 编程
- 8.2.1 UI 编程概述
- 8.2.2 初识 Tkinter
- 8.2.3 常见 GUI 构件的用法
- 8.2.4 布局
- 8.2.5 对话框*
- 8.3 Tkinter 事件驱动编程
- 8.3.1 事件和事件对象
- 8.3.2 事件处理
- 8.4 模型-视图设计方法
- 8.4.1 将 GUI 应用程序封装成对象
- 8.4.2 模型与视图
- 8.4.3 编程案例:汇率换算器
- 8.5 练习
- 第 9 章 模拟与并发
- 9.1 模拟
- 9.1.1 计算机建模
- 9.1.2 随机问题的建模与模拟
- 9.1.3 编程案例:乒乓球比赛模拟
- 9.2 原型法
- 9.3 并行计算*
- 9.3.1 串行、并发与并行
- 9.3.2 进程与线程
- 9.3.3 多线程编程的应用
- 9.3.4 Python 多线程编程
- 9.3.5 小结
- 9.4 练习
- 第 10 章 算法设计和分析
- 10.1 枚举法
- 10.2 递归
- 10.3 分治法
- 10.4 贪心法
- 10.5 算法分析
- 10.5.1 算法复杂度
- 10.5.2 算法分析实例
- 10.6 不可计算的问题
- 10.7 练习
- 第 11 章 计算+X
- 11.1 计算数学
- 11.2 生物信息学
- 11.3 计算物理学
- 11.4 计算化学
- 11.5 计算经济学
- 11.6 练习
- 附录
- 1 Python 异常处理参考
- 2 Tkinter 画布方法
- 3 Tkinter 编程参考
- 3.1 构件属性值的设置
- 3.2 构件的标准属性
- 3.3 各种构件的属性
- 3.4 对话框
- 3.5 事件
- 参考文献