19.4 其他GUI简介

我们期望最终能编写出独立的一章来对GUI编程作总体介绍,Python拥有的大量图形工具集中有很多内容值得一讲,然而,这只能是以后的事了。作为替代,我们将使用其中4种比较流行且可用的工具集来编写同一个GUI程序例:Tix (Tk Interface eXtensions) 、Pmw (Python MegaWidgets的Tkinter扩展)、wxPython (wxWidgets的Python绑定)和PyGTK (GTK+的Python绑定)。你可以在本章末尾参考部分获取更多信息和下载这些工具集的地方。

Tix模块包含在Python标准库中,已经可用了。其他工具集是第三方的,你必须自己下载。因为Pmw只是对Tkinter的一个扩展,它的安装是最简便的(只需解压到你的网络包目录下)。wxPython和PyGTK涉及下载多个文件并编译(除非你使用的是Win32版本,这样的话通常有安装包可用)。一旦这些工具集安装好并通过证,我们就能开始了。我们不打算局限在本章已经讲过的那些组件上,我们准备在后面的例子中介绍一些更复杂的组件。

除了我们已经看到过的标签和按钮组件,我们还准备介绍控制按钮(Control,又叫微调按钮,SpinButton)和组合框组件(ComboBox) 。控制组件是一个文本组件和一对箭头按钮的组合,文本值受旁边按钮的“控制”或者说“旋上、旋下”,而组合框则通常包括一个文本组件和一个下拉菜单,菜单项列表中当前激活或选中的项目将显示在文本组件中。

我们的应用程序相当简单:成对的动物要被搬走,动物的总数在从一对到一打(12只)的范围内。用控制组件来显示总数,用组合框显示动物种类列表菜单供用户选择。注意默认的动物数量是2,且没有选择动物类型。

一旦我们开始执行这个程序,事物就变得不同了,图19-9就是例证,它显示的是在Tix程序中改变一些元素后的结果。

19.4 其他GUI简介 - 图1

图 19-8 Win32下使用各种GUI的应用程序(animal*.pyw)

19.4 其他GUI简介 - 图2

图 19-9 修改我们应用程序的Tix GUI版本后(animalTix.pyw)

下面,你将看到所有4个版本的GUI程序代码。你会发现尽管它们有些相似,但每一个都有自己的特别之处。而且我们使用。pyw作为文件后缀,这样可以防止弹出Dos命令窗口或终端窗口。

19.4.1 Tk Interface eXtensions (Tix)

我们从一个使用Tix模块的例子(19. 7)开始。Tix是对Td/T(译者注:应该是Tcl/Tk,应为作者笔误)的一个扩展库,其中增加了许多新的组件、图像类型和其他一些命令,提高Tk作为GUI开发工具集的可用性。我们现在来看看如何在Python中使用Tix。

例19.7 Tix GUI编程演示(animalTix.pyw)

我们的第一个例子使用Tix模块。Tix已经是Python的一部分了!

19.4 其他GUI简介 - 图3

19.4 其他GUI简介 - 图4

逐行解释

1 ~ 7行

这里都是些初始化代码,模块导入操作,以及基本的GUI操作。第7行的断言要求程序可以使用Tix模块。

8 ~ 27行

这些行创建了所有的组件:标签(9~11行)、控制(13〜16行)、组合框(18〜21行)和退出按钮(23〜25行)。组件构造器里的参数都很浅显明了无需更多解释。最后,我们在第27行进入GUI主事件循环。

19.4.2 Python MegaWidgets (PMW)

下面通过例19. 8让我们来看看Python MegaWidgets。这个模块体现了Tkinter悠久的历史。它基本上是通过在GUI工具集中添加一些新式的组件来延长Tkinter的寿命。

这个Pmw的例子和上面Tix的例子是如此相似,以致我们不准备对读者逐行解释它。代码中区别最大的一行是控制组件的构造器,那个Pmw的控制组件。它提供了验证函数的入口。不同于直接在组件构造器中以关键字参数的形式传入最大、最小值,Pmw使用“验证器”来确保值不会超出我们可接受的范围。

现在我们终于要离开Tk的世界了。Tix和Pmw分别扩展了Tk和Tkinter,然而我们现在将改变方向去看看完全不同的工具集,即wxWidgets和GTK+。在使用这些现代的、健壮的GUI工具集时,你将发现代码的行数增加了,这是因为我们使用了更多的面向对象特性。

19.4.3 wxWidgets和wxPython

wxWidgets(以前称作wxWindows)是一个跨平台的工具集,用来构建图像用户程序。它用C++实现并在各种平台上广泛使用,wxWidgets为这些平台定义了一致、通用的API。 wxWidgets最大的优点是它在每个平台上都使用原生GUI,所以你的程序将和所有其他桌面程序有相同的外观和用户体验。另一个特点是你不会被局限于使用C++开发wxWidgets应用程序。它有对Python和Perl的接口。

例19.8使用wxPython展示了我们那个动物应用程序。

例19. 8

我们的第二个例子使用Python MegaWidgets包。

19.4 其他GUI简介 - 图5

19.4 其他GUI简介 - 图6

逐行解释

5 ~ 37行

这里我们先编写了一个框架类(5〜8行),它的唯一成员即其构造器。这个方法的唯一实用目的就是创建我们的组件。在框架组件中,我们创建了一个画板组件(panel) 。在画板中我们用BoxSizer来包含所有其他组件并对其布局(第10行和第36行),这些组件是标签(12〜14行)、微调按钮(16〜20行)、列表框(22〜27行)和退出按钮(29〜34行)。

例19.9 wxPython GUI演示(animal Wx.pyw)

我们的第三个例子使用wxPython及wxWidgets。注意我们把所有的组件都放在一个布局管理器里,以及该程序中更多的面向对象本质。

19.4 其他GUI简介 - 图7

19.4 其他GUI简介 - 图8

我们不得不手工为微调按钮和组合框组件添加标签,因为它们看起来并不包含标签。一旦我们创建好这些,就把他们加到布局管理器中,再把布局管理器交给画板组件,并确定其中每个组件的布局。你会注意到第10行说明布局管理器是垂直走向的,这表明我们所有的组件都会按从上到下的顺序排列。

微调按钮组件有一个弱点,它不支持“步进”功能。在其他3个例子中,我们可以点箭头按钮让控制组件每次增加或减少2,但对这个组件却不行。

39 ~ 51行

我们的应用程序类实例化了一个刚才设计的框架对象,把它绘制在屏幕上,并设置成程序的顶层窗口。最后,几行安装代码实例化了GUI应用程序对象并启动之。

19.4.4 GTK+和PyGTK

最后是PyGTK版的例子,它和wxPython GUI程序非常相似(见例19. 10) 。最大的不同是我们只用一个类,还有那些设置对象——实际上就是按钮——前景、背景色的代码实在是很冗长。

逐行解释

1 ~ 6行

我们导入了3个不同的模块和包,PyGTK、GTK和Pango。Pango是一个用来布局和生成文本的库,专用于实现I18N。这里需要这个库是因为它体现了GTK+ (2.x)对文字和字体处理的核心思想。

我们最后一个例子使用PyGTK(和GTK+) 。类似wxPython的例子,这里对应用程序也用了一个类。对比一下这两个GUI程序例子的相似和不同点是很有趣的。这种现象并不奇怪,它使得开发者可以比较容易的转用其他工具集。

19.4 其他GUI简介 - 图9

19.4 其他GUI简介 - 图10

8 ~ 15行

GTKapp类反应了本程序中所有的组件。顶层窗口在这里创建(窗口管理器负责关闭它),而且还创建了一个垂直走向的布局管理器(VBox)来掌管我们的主要组件。这些实际上和我们在wxPython GUI程序中作的一样。

然而,为了让微调按钮和组合框的静态文本能出现它们的左侧(wxPython例子中出现在上方),我们创建了小型的水平走向的方框来包括标签组件对(18〜36行),而且还把这些HBox完全置于VBox的掌控之下。

接下来我们创建了退出按钮并把VBox添加到顶层窗口中,然后把一切绘制到屏幕上。你一定注意到我们刚开始用空标题创建了按钮。我们这样做是为了让标签(子)对象能作为按钮的一部分被创建。在45〜46行,我们取得标签的访问权并用白色字体设置了文字。

我们这样做的原因是如果你直接设置前景风格——通过41〜44行的循环和辅助代码——那么前景只会对按钮起作用而对其他——例如标签—却是无效的,假如你把前景设为白色并把焦点置在按钮上(通过按TAB键可以“选中”它),你将看到用来标识选中组件的内点画线是白色的,而标签文字却依然是黑色的,除非你像我们在第45行(译者注:原文为“第46行”,应为作者笔误)那样改一下。

53 ~ 55行

我们在这里创建了应用程序并进入主事件循环。