窗口(window)可能是读者最熟悉的一种 GUI 构件了②,它是一个由程序控制的矩形屏 幕区域,在此区域中可以放置其他构件。像窗口这样的能够容纳其他构件的构件,一般称为 容器(container)。对于窗口,用户常做的操作是移动、改变大小等。每个 Tkinter 程序都必 须创建一个最外层的窗口,称为根窗口。

    在窗口中通常会布置许多用于与用户进行交互的构件,如标签(label)、按钮(button)、 菜单(menu)等等。这些构件是基本界面元素,它们不再包含其他构件。每种构件都有各自 的用途,例如接受用户输入、执行命令、显示信息等。

    图 8.2 多级结构的界面

    窗口或框架是容器构件,能够包含其他构件,由此可见构件之间存在着一种层次关系, 称为父子关系。在图 8.2 中,窗口 W 包含框架 F1 等构件,我们称 W 是 F1 等构件的父构件, F1 等都是 W 的子构件。同样,F1 又包含勾选钮 C1 和 C2,故 F1 是 C1 和 C2 的父构件,C1 和 C2 是 F1 的子构件。设计 GUI 时,必须明确指出构件之间的父子关系。仍以图 8.2 为例: 创建 F1 时必须指明是在 W 中创建,创建 C1 时必须指明是在 F1 中创建。

    在父构件(窗口或框架)中如何安排子构件的位置?这属于图形界面的布局问题,GUI 工具包一般提供布局管理器(layout manager 或 geometry manager)用于布局设计。Tkinter 提供了 Pack、Grid 和 Place 等三种布局管理器,使得在容器中布置子构件的任务轻而易举。