2 Python GUI

借助Python语言的优势,使用Python的界面库开发界面程序,开发周期更短。但因为Python的界面开发库底层实现一般不是Python,只是为Python封装的接口,所以在开发自由度上还是有一些限制,适用于开发辅助工具或者不以用户界面为竞争点的项目中。

2.1   界面库的选择

比较常用的是Tkinter, PYQT, wxPython三个界面库。都具有跨平台特性。

2.1.1  Tkinter(tkinter)

Tkinter(tkinter)是Python自带的图形界面库,对于辅助开发测试的界面化小工具,可以选择使用。

2.1.2    PyQt

PyQt是Python对于C++界面库Qt的成功封装,具有Qt开发经验的同事可以选择使用。

Ø 特点

界面活泼,跨平台特性比wxPython要好,兼容不同的平台需要适配的代码更少。安装包内置设计界面外观资源的Designer工具,并包含PyQt Examples and Demos和Documentation辅助开发。

Ø 版本

Qt公司已经不再维护Qt 4.x的版本,所以,作为新开发的项目,也推荐选择PyQt 5.x,最新的版本是5.9.2。下载地址:

https://www.riverbankcomputing.com/software/pyqt/download5

最方便的安装,不要下载源码,直接下载bin安装包,就什么都齐了。不然还要安装一堆东西,非常的麻烦。

需要注意一点是,Qt 5.x的版本是基于Python 3.x的版本进行封装。

如果商用PyQT,需要购买授权。

2.1.3     wxPython

wxPython是C++界面库wxWidgets的Python封装,开发接口和机制与微软的C++界面库MFC十分相似,具有MFC开发经验的同事可以选择使用。

Ø 特点

Python 2.x和Python 3.x在PyPI都有维护版本。相比PyQt,wxPython以LGPL协议发布,开源使用,使用时只要不修改源码,发布产品时也可闭源发布。

Ø 版本

PyPI维护有最新的4.0版本,针对Python主流的各个维护版本:https://pypi.python.org/pypi/wxPython/4.0.0b2

SourceForge提供有最新版和历史版本,进入各个分支还有开发文档和样例代码可以下载。

2.2   wxPython界面开发

此处以wxPython为例,简单介绍wxPython界面开发的基本方法。

wxPython有一版教程wxPython in action是比较经典的入门学习资料可以参考。

原版网址:

https://www.manning.com/books/wxpython-in-action

中文版《活学活用wxPython》:

https://wiki.woodpecker.org.cn/moin/WxPythonInAction

因为界面开发的特点是在开发过程中需要反复查看调整界面的实现效果,纯手动开发效率太低。wxPython当前比较好用的界面设计工具有BOA-constructor(简称BOA),wxFromBuilder,下面以BOA为例进行介绍。

BOA下载地址:https://sourceforge.net/projects/boa-constructor/

2.2.1    BOA工具简介

安装完成后,双击Boa.exe打开wxPython界面开发环境。如下图:

python tkinter 消息 tkinter pyqt_界面库

Boa-constructor如上图分为上,左下和右下三个窗口。上面是帮助文档按钮栏及可视化控件选择工具栏窗口(以下简称工具窗口),三个帮助文档按钮

从左至右依次是boa-constructor,wxPython及Python的三个帮助文档,相关控件我们后续进行介绍;左下是控件属性窗口(以下简称属性窗口),包括控件的基本属性,扩展属性,事件和控件层次结构视图;右下是Python源文件的IDE编辑环境窗口(以下简称编辑窗口),支持代码的运行及调试,可视化窗口的预览,并能够查看应用程序的模块结构,源代码文件的查看及修改,控件及相关事件的结构的查看及代码快速定位,数据及控件布局器sizer的结构视图。

2.1.1      应用程序框架生成

在工具栏的New标签下,找到生成wxPython应用程序的按钮wx.App,点击后在编辑窗口生成wxPython的App文件和Frame文件:

python tkinter 消息 tkinter pyqt_控件_02

将这两个文件根据需要更改名称后保存到相同的工程目录下。

python tkinter 消息 tkinter pyqt_python tkinter 消息_03

回到BOA,点击编辑窗口Frame Designer按钮(以下简称预览按钮),可以预览初始Frame的外观,代表界面生成成功:

在Inspector面板,可以调整Frame的各项属性:

python tkinter 消息 tkinter pyqt_控件_04

点击Editor工具栏上的运行按钮:

python tkinter 消息 tkinter pyqt_控件_05

即可运行出GUI的界面框架:

python tkinter 消息 tkinter pyqt_界面库_06

2.1.1    控件和响应事件的添加

选择Frame文件,点击预览按钮。在工具窗口的Containers/Layout标签下,点击wx.Panel控件

python tkinter 消息 tkinter pyqt_Python_07


python tkinter 消息 tkinter pyqt_界面库_08

在Frame的预览窗口上左键点击,即把panel控件放置在Frame面板上,关闭再打开预览,panel填充整个Frame面板:

python tkinter 消息 tkinter pyqt_界面库_09

类似地,在Panel上放置一个按钮。

在工具窗口的Buttons标签下,点击wx.Button控件

python tkinter 消息 tkinter pyqt_Python_10

python tkinter 消息 tkinter pyqt_控件_11

在Frame的预览窗口上左键点击,即把Button控件放置在Frame上的Panel面板上:

python tkinter 消息 tkinter pyqt_python tkinter 消息_12

wxPython通过传递窗口事件消息的机制调用对应的函数处理UI界面交互事件,boa-constructor提供了相应的界面操作方法自动添加各种控件的消息处理函数。

在预览panel上选定该button,在属性窗口的Evts标签下列出了button控件的一些事件。

python tkinter 消息 tkinter pyqt_python tkinter 消息_13

对应于button控件,点击button控件的事件是

python tkinter 消息 tkinter pyqt_界面库_14

,双击wx.EVT_BUTTON,在代码相应位置就自动生成了相应点击该button的消息处理函数。

python tkinter 消息 tkinter pyqt_界面库_15

可以手动添加自己的代码来控制按钮事件的事件响应。

在Evts标签下其他的一些事件是继承自窗口类(window)的一些事件(wx.Butoon继承自wx.Window类)

其他控件的事件相应函数的添加方法类似于此,具体控件具体事件传递的消息可以通过wxPython的示例代码进行学习。

2.1.1   界面布局器Sizer

如果考虑到手动调整界面上各个控件的绝对坐标位置比较繁琐,或者应用程序主窗口有改变大小的需求,那么使用Sizer是一个好的选择。Sizer能够根据它所包含的子控件的个数及父窗口的大小自动计算并设置控件坐标,并在主程序窗口改变大小时做出适应界面大小的布局设置。

具体使用方法可参考《活学活用wxPython》使用Sizer放置窗口部件章节。BOA同样在工具栏上提供了可视化的工具对应不同类型Sizer的功能。

2.2   补充

使用界面设计工具具有开发快速的优点,但对于一些扩展控件或者自定义控件,就不能很方便的集成进来。

BOA对于设计工具自动生成的代码,不能进行修改,否则不能再次识别预览,对于这一点,可以继承生成的类对象,在子类中进行个性化的修改,解耦生成代码和自定义代码,方便后来的维护工作。

对于另外一个界面设计工具wxFromBuilder,它的设计界面通过一个project保存下来,识别预览不依赖于python代码。只要project存在,就可以再次生成python代码,避免了上面BOA的问题,有兴趣的同事可以尝试使用。

   作者:lurayvis