ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
### 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 的图形界面设计非常简单,可概括为创建 构件并在窗口中进行布局的过程。接下来我们就要具体学习各种图形构件的使用方法和布局 方法。