8.1.2 图形界面的组成
应用程序的图形界面是由底层操作系统支持的,不同操作系统平台的图形界面风格不尽相同,但组成界面的图形元素都是类似的。下面我们采用 Python 的标准图形界面工具包Tkinter 的术语来介绍图形界面元素。 图形界面由多种图形元素组成,这些图形元素称为构件(widget)①。就如一部机器由各种零部件组成一样,图形界面这部“机器”的零部件就是构件。从程序角度看,每个构件都 表示了程序的某个数据并提供了对此数据的操作。用户与构件进行交互,从而使用或控制程 序的某个数据。设计 GUI 时,程序员的任务就是合理地利用各种构件,将它们搭配组合起来,, 目标是提高用户与应用程序的交互效率。
窗口(window)可能是读者最熟悉的一种 GUI 构件了②,它是一个由程序控制的矩形屏 幕区域,在此区域中可以放置其他构件。像窗口这样的能够容纳其他构件的构件,一般称为 容器(container)。对于窗口,用户常做的操作是移动、改变大小等。每个 Tkinter 程序都必 须创建一个最外层的窗口,称为根窗口。
在窗口中通常会布置许多用于与用户进行交互的构件,如标签(label)、按钮(button)、 菜单(menu)等等。这些构件是基本界面元素,它们不再包含其他构件。每种构件都有各自 的用途,例如接受用户输入、执行命令、显示信息等。
如果窗口中包含的构件很多,布置不当的话会使界面杂乱无章,降低界面的易用性。这 时可以用框架(frame)构件来分隔窗口空间和组合构件,以使界面结构清晰。框架也是矩形 屏幕区域,通常用作容器,是建立多级结构的图形界面的基本组织工具。例如,图 8.2 显示 的窗口中用到两个框架和两个按钮,框架 F1 中包含两个勾选钮。
① 别的系统也有称为控件或组件的。
② 微软公司的图形化操作系统干脆以 Windows 命名。
图 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 等三种布局管理器,使得在容器中布置子构件的任务轻而易举。