Python作为一个开源的解释型编程软件,在教学、科研、实际项目中用得越来越多。Python易学易用,程序资源丰富,在编程解决一些科学计算问题时比较实用,但是Python自带的Tkinter包设计GUI程序的功能比较弱,无法设计专业的GUI应用程序。
Qt C++类库是一套广泛使用的跨平台GUI设计类库,PyQt5是Qt5 C++类库的Python绑定,使用PyQt5在Python里编程,可以将Python丰富的科学计算、图形显示等功能与PyQt5的GUI设计功能结合起来,开发出比较专业的Python GUI应用程序,便于对研究成果进行有效的集成与展示。
目前,介绍Python编程的书很多,但是专门介绍PyQt5 GUI编程的书很少。目前有这样一本《Python Qt GUI与数据可视化编程》即将出版。推荐给有需要的你们。
本书主要内容包括:
基于PyQt5的GUI应用程序的技术框架和工具软件的使用;
GUI程序设计中常用界面组件和功能模块的使用;
使用PyQtChart、PyQtDataVisualization、Matplotlib在GUI程序中嵌入二维和三维数据可视化功能的编程方法。
详细内容结构
本书介绍在Python中使用PyQt5、PyQtChart、Matplotlib等进行GUI应用程序设计和数据可视化编程的方法,全书的内容分为三部分。
第一部分是PyQt5开发基础,包括第1章和第2章。?
第1章介绍Python、Qt、PyQt5的特点和安装方法,在Windows中建立开发环境。
第2章介绍使用PyQt5开发GUI应用程序的基本框架原理,包括GUI应用程序的基本结构、使用可视化设计UI窗体时开发GUI程序的流程和框架、信号与槽的使用方法等。掌握了第2章的内容就掌握了PyQt5开发GUI应用程序的框架性原理,再学习第二部分和第三部分就很容易了。
第二部分是GUI应用程序设计,从第3章至第11章。
这部分介绍GUI应用程序设计中常用的一些功能模块的编程使用方法,包括常用界面组件的使用、Model/View结构、事件处理、对话框和多窗口设计、数据库、绘图、文件读写和操作、多媒体、多语言界面和Qt样式表定制界面等。
这部分的内容根据PyQt5和Python各自的特点做了取舍,总体的原则就是对GUI程序设计中必需的,而Python中没有或功能不强的模块进行介绍。例如,Python虽然有自带的数据库、多媒体、文件读写功能模块,但是功能不如PyQt5的相应模块,或不易与PyQt5的GUI程序的窗口界面结合使用,因此本书就介绍PyQt5的数据库、多媒体、文件读写功能模块。而Python自带的多线程编程功能已经比较全,且不涉及用户界面,因此本书就不介绍PyQt5的多线程编程功能。Python有很多功能强大的第三方网络功能模块,因此没有必要介绍PyQt5的网络编程功能。
第三部分是数据可视化编程,从第12章至第14章。
Chart和Data Visualization模块是Qt C++类库的一部分,分别用于二维图表绘制和三维数据可视化,但是PyQt5中没有这两个模块,需要单独安装PyQtChart包和PyQtDataVisualization包。第 12 章介绍使用PyQtChart模块绘制各种二维图表的编程方法,第13章介绍使用PyQtDataVisualization模块绘制三维柱状图、三维散点图和三维曲面图的编程方法。
Matplotlib是Python中应用最广泛的数据可视化模块,但是一般介绍Matplotlib数据可视化的书很少详细介绍将Matplotlib嵌入GUI窗口上的编程方法。第14章专门介绍Matplotlib与PyQt5结合,嵌入GUI程序中实现数据可视化的编程方法,这是在编写集成化的Python GUI应用程序时经常遇到的,是非常实用的功能。
本书学习路线
本书使用的编程语言是Python,但是本书并不会介绍Python语言基础,需要读者对Python编程有一定的了解,特别是对Python的面向对象编程原理要比较熟悉。如果读者对Python不够熟悉,需要参考专门介绍Python编程基础的书,学会Python后再来学习本书。
本书的内容虽然用到Qt的IDE,即Qt Creator,但是并不需要编写任何C++语言程序,所以读者无须具有C++语言基础。当然,如果读者有C++语言基础,或者对Qt C++编程比较熟悉,对阅读本书的内容是非常有帮助的。
学习本书应从第一部分开始。第1章介绍本书用到的各个软件及其安装,搭建开发环境。第2章是本书的基础和重点内容,介绍了PyQt5 GUI应用程序的基本代码框架、基于UI窗体可视化设计的GUI应用程序的设计流程和工具软件pyuic5的使用、UI与窗体业务逻辑分离设计的原理、Qt的核心技术信号与槽的使用方法、Qt Creator中管理和使用资源文件,以及通过工具软件pyrcc5将资源文件转换为Python程序的方法。第2章还创建了3个单窗口项目模板,本书的大部分示例都是基于这几个项目模板创建的。
掌握了第2章的内容就掌握了用PyQt5设计GUI程序的技术框架,剩下的就是PyQt5中用于GUI应用程序设计的各种类的使用了。
第二部分介绍PyQt5 GUI程序设计中各个技术模块的使用方法,包括常用界面组件、Model/View结构、事件处理、对话框与多窗口设计、数据库、绘图、文件、多媒体等,读者可以根据自己的需要学习或查阅相应章节。第11章有两个新的技术点不在第2章介绍的技术框架内,分别是多语言界面设计方法和Qt样式表定制界面方法。
第三部分介绍数据可视化设计方法。PyQtChart和PyQtDataVisualization是Qt C++类库相应模块的Python绑定,分别用于二维图表和三维数据可视化设计,其内容的介绍比较全面。另外由于Matplotlib在Python数据可视化中应用广泛,第14章专门介绍将Matplotlib嵌入GUI窗体上实现交互式数据可视化的设计方法,包括主要的技术点和一些常用二维图和三维图的编程使用方法。
PyQtChart、PyQtDataVisualization与Matplotlib的某些功能是重合的,但它们各有千秋,读者可根据自己的需要和熟悉的内容选择学习和使用。如果读者熟悉Qt C++类库中的二维图表和三维数据可视化模块的使用,就参阅第12章和第13章;如果读者熟悉Matplotlib的使用,就参阅第14章。
样章试读:
第一章:开发环境安装
本书介绍如何在Python中使用PyQt5进行图形用户界面(Graphical User Interface,GUI)应用程序开发,使用的编程语言是Python,构建开发环境需要安装的软件有Python 3、Qt 5和PyQt5。
本章介绍各个软件的功能特点、安装和基本使用方法,以及构建本书介绍内容所需的开发环境。本书所有程序都是在64位Windows 7平台上开发的,但由于Python和Qt都是跨平台的,因此所介绍的内容在Linux等平台上也是适用的。
1.1 Python
1.1.1 Python 简介
Python是由Guido van Rossum在1989年开发,然后在1991年初发布的。Python是一种跨平台的解释型语言,它功能强大,简单易学,具有面向对象编程的功能。Python是完全开源的软件,具有开放的特性,能很方便地将其他语言(尤其是C/C++)的类库封装为Python的模块来使用。
由于Python语言的特点,以及其开源和开放的特性,吸引了编程社区为Python开发了很多实用且功能强大的包(package),例如用于矩阵处理和线性代数计算的NumPy,用于科学计算的SciPy,用于数据分析的Pandas,用于数据可视化的Matplotlib等,这使得Python在科学计算、数据分析、数据可视化、神经网络、人工智能、Web编程等各方面得到了广泛的应用,逐渐成为一种主流的编程语言。
1.1.2 Python的下载与安装
Python是一个完全开源的软件,从官网上可以下载最新版本的Python安装文件。Python 3和Python 2是不兼容的,本书就不考虑Python 2了,直接下载最新的发布版本Python 3.7.0。
Python是跨平台的,有Windows、Linux、macOS等各种平台的安装文件。本书的示例程序都是在64位的Windows 7平台上开发的,所以下载64位Windows平台的离线安装文件。Python的安装过程与一般的Windows程序安装过程一样,在一个安装向导里完成安装过程。
安装向导的第一步如图1-1所示。在此窗口里勾选“Add Python 3.7 to PATH”,会自动将安装后的Python的两个文件夹路径添加到Windows系统的环境变量PATH里,这样就可以在Windows的cmd窗口里直接执行Python的一些工具程序,如python.exe、pyuic5.exe等。
图1-1 Python安装向导第一步
在图1-1中点击“Customize installation”进行定制安装,出现的窗口如图1-2所示,在此窗口中勾选所有选项。其中,pip默认是不勾选的,一定要勾选此选项。pip是Python的包管理工具程序,使用pip可以很方便地下载和安装各种第三方的Python包,包括后面用到的PyQt5、PyQtChart等,都需要通过pip安装。
图1-2 Python安装向导第二步
继续按照向导提示完成安装。这里设置Python安装到“D:\Python37”目录下,这个目录下有Python的主程序文件python.exe和pythonw.exe。
文件夹“D:\Python37\Scripts”下存放的是Python的一些工具软件,如pip.exe和pip3.exe。在安装其他一些第三方模块或工具软件后,可执行文件都安装到此目录下,例如安装PyQt5之后,会在此目录下增加3个可执行文件。
路径“D:\Python37”和“D:\Python37\Scripts”会被安装程序自动添加到Windows系统的PATH环境变量里,这两个目录下的文件就可以在Windows的cmd窗口里直接执行。如果在安装的第一步(图1-1)中没有勾选“Add Python 3.7 to PATH”,那么这两个路径不会自动添加到PATH环境变量里,需要在安装后手动添加。
1.1.3 IDLE的基本使用
Python安装后有一个交互式操作环境IDLE,其运行时界面如图1-3所示。在此交互式操作环境里,可以执行Python的各种语句。
在图1-3窗口的“File”菜单下,点击“New File”,可以打开一个文件编辑器,在这个编辑器里可以编写Python程序,然后保存为后缀为“.py”的文件。例如,在图1-4的窗口中简单地输入了两行语句,然后保存为文件hello.py。
图1-3 Python自带的IDLE交互式操作环境
点击图1-4文件编辑器的菜单项“Run”→“Run Module”,或直接按快捷键F5执行此程序,在交互式窗口里就会输出运行结果。
图1-4 Python程序文件编辑器
IDLE的功能比较简单,不像其他一些Python IDE(如Eric、PyCharm)功能那么强大,但是基本的程序编辑和调试功能是具备的。IDLE对于初学者来说简单易用,编写和调试规模不大的程序是够用的,因此本书就使用IDLE作为Python开发环境。
IDLE的文件编辑器有以下一些常用的快捷键非常有用。
Ctrl+],选中的代码行右缩进一个Tab。
Ctrl+[,选中的代码行左移一个Tab。
Ctrl+S,保存文件。
Alt+3,在选中代码行的最左端添加注释符号“##”。
Alt+4,删除选中代码行最左端的注释符号“##”。
F5,运行编辑器内的程序文件。
因为Python源程序是采用缩进确定代码段的,排版时为减少缩进空格数和缩进层级,本书设置TAB为3个空格(点击IDLE的“Options”→“Configure IDLE”菜单项进行设置),并且在程序中也基本不使用try…except和try…finally等语句块。
IDLE也具有程序调试功能。在文件编辑器中打开需要调试的源程序文件,通过鼠标右键快捷菜单在当前行设置或取消断点。在IDLE交互环境中,点击“Debug”→“Debugger”菜单项,出现如图1-5所示的调试控制窗口。按F5开始运行程序后,就进入调试状态。在调试状态下,使用图1-5窗口上的“Go”“Step”“Over”等按钮进行程序调试。程序调试的方法与一般IDE的程序调试方法类似,这里就不详细介绍了。
图1-5 程序调试控制窗口
本书不对Python语言基础做介绍,假定读者已熟悉Python语言编程的基本方法,掌握了Python中类的使用方法。如果读者对Python的基本编程不熟悉,需要找一本专门介绍Python编程基础的书学习后再来学习本书的内容。
除了Python自带的IDLE,还有许多其他用于Python编程的IDE,如PyCharm、Eric等。本书的示例程序都用IDLE编程和调试,如果读者习惯于使用其他的IDE,也可以使用自己习惯的编程环境。因为Python是解释型语言,无须编译,所以无论使用哪个IDE都可以实现Python程序的编写和运行。
1.1.4 安装Python包
Python的一大特点就是有大量的包(package)可供使用,而且都是开源的。PyPI(Python Package Index)网站就是Python程序资源的集散地,在这个网站上可以查找、下载、发布Python包。
在Windows的cmd窗口里使用pip3指令可以直接从PyPI网站下载包并安装。例如,SIP是一个用于将C++库转换为Python扩展模块的工具软件,这种扩展模块称为C++库的Python绑定(binding)。要安装SIP只需在Windows的cmd窗口里执行如下的指令:
?
pip3 install sip
这条指令中的pip3就是“D:\Python37\Scripts”目录下的程序pip3.exe;install是指令参数,表示安装,相应地,卸载用uninstall;sip是需要安装的包的名称。
执行这条指令时,pip3会自动链接到PyPI网站上,查找最新版本的SIP,如果找到就自动下载并安装。成功安装后,在“D:\Python37\Lib\site-packages”目录下会出现SIP相关的子目录和文件,该目录下存放的都是安装的Python包。
如果要卸载已安装的SIP,执行下面的指令即可。
?
pip3 uninstall sip
如果直接链接国外的PyPI服务器速度比较慢,可以在pip3指令中指定使用镜像服务器。例如,使用清华的镜像服务器安装SIP的指令是:
?
pip3 install –i https://pypi.tuna.tsinghua.edu.cn/simple sip
1.2 Qt
1.2.1 Qt 简介
Qt是一个跨平台的应用程序C++开发类库,支持Windows、Linux、macOS等各种桌面平台,也支持iOS、Android等移动平台,还支持各种嵌入式系统,是应用非常广泛的跨平台C++开发类库。
Qt最早是由挪威的Haavard Nord和Eirik Chambe-Eng在1991年开始开发的,在1994年发布,并成立了一家名为Trolltech的公司。Trolltech公司在2008年被诺基亚公司收购,2012年,Qt被Digia公司收购,2014年从Digia公司拆分出来成立了独立的Qt公司,专门进行Qt的开发、维护和商业推广。
Qt的许可类型分为商业许可和开源许可,开源许可的Qt就已经包含非常丰富的功能模块,可用于Qt学习和一般的应用程序开发。
1.2.2 Qt 的下载与安装
在Python中使用PyQt5编写程序可以只安装PyQt5,而不必安装Qt的开发环境。但是为了使用Qt的IDE(即Qt Creator)的一些功能如UI窗体可视化设计、Qt类库帮助信息查找、资源文件管理等,安装Qt是有必要的。
从Qt官网可以下载最新版本的Qt软件。Qt分为商业版和社区版,社区版就是具有开源许可协议的免费版本。Qt的版本更新比较快,本书使用的是Qt 5.12.0,这是一个LTS(Long Term Supported)版本。
下载的Windows平台的Qt离线安装文件是一个可执行文件,运行文件就可以开始安装。安装过程与一般的Windows应用程序安装过程一样,按照向导进行操作即可。
在设置安装路径时,选择安装到“D:\Qt\Qt5.12.0”目录下,当然也可以安装在其他路径下。设置为这个路径,是为了在后面需要讲到Qt的路径时使用此绝对路径。
在安装过程中会出现如图 1-6 所示的安装模块选项设置页面,在这个页面里选择需要安装的模块。“Qt 5.12.0”节点下面是Qt的功能模块,包括用于不同编译器和平台的模块,这些模块如下。
图1-6 Qt安装模块选项设置
使用MSVC(Microsoft Visual C++)编译器的模块,包括MSVC 2015 64-bit、MSVC 2017 32-bit和MSVC 2017 64-bit。若要安装这几个模块,需要在计算机上预先安装相应版本的Microsoft Visual Studio。本书不是为了研究Qt C++编程,因此无须安装这些模块。
MinGW 7.3.0 64-bit编译器模块。MinGW(Minimalist GNU__for Windows)是Windows平台上使用的GNU工具集的导入库的集合。为了使用Qt的IDE Qt Creator,必须安装至少一个编译器,可以选择安装这个模块。
用于UWP平台的编译器模块。UWP(Universal Windows Platform)是Windows 10中的编译模块,有不同CPU和编译器类型的UWP模块,本书无须安装。
用于Android平台的编译模块,包括Android x86、Android ARM64-v8a等,这是用于Android平台开发的编译模块,本书无须安装。
Sources是Qt C++类库的源程序,本书无须安装。
Qt Charts是二维图表模块,用于绘制柱状图、饼图、曲线图等常用二维图表。对于Python,有相应的PyQtChart包,在第12章会介绍其使用。选择安装此模块,便于查看相关类的帮助信息。
Qt Data Visualization是三维数据图表模块,用于数据的三维显示,如散点的三维空间分布、三维曲面等。对于Python,有相应的PyQtDataVisualization包,在第13章会介绍其使用。选择安装此模块,便于查看相关类的帮助信息。
Qt Purchasing、Qt Virtual Keyboard、Qt WebEngine 等其他模块,这些模块在本书里不会讲到,可以根据自己的需要选择是否安装。
Qt Script(Deprecated)是脚本模块,这是个已经过时的模块,无须安装。
“Tools”节点下面是一些工具软件,这些软件如下。
Qt Creator 4.8.0是用于Qt程序开发的IDE,在开发PyQt5的程序时需要使用此软件进行窗体可视化设计、查阅类的帮助信息等,必须安装(自动)。
Qt Creator 4.8.0 CDB Debugger support for Qt Creator,是用于支持在Qt Creator中进行程序调试的模块,可以不安装。
MinGW 7.3.0是MinGW 64-bit 编译工具链,需要安装。
Strawberry Perl是一个Perl语言工具,无须安装。
1.2.3 Qt的几个工具软件
安装完成后,在Windows“开始”菜单里建立的“Qt 5.12.0”程序组内容如图1-7所示。程序组中的一个主要程序是Qt Creator 4.8.0(Enterprise),它是用于开发Qt程序的IDE,是Qt的主要工具软件。
根据选择安装的编译器模块会建立相应的几个子分组,例如,在图1-7中有两个版本的编译器模块,即MinGW 7.3.0(64-bit)和MSVC 2015(64-bit),每个分组下面都有以下3个工具软件。
图1-7 安装后“开始”菜单里的“Qt 5.12.0”程序组
Qt Assistant是一个独立的查看Qt帮助文档的工具软件。在Qt Creator中也可以方便地查看Qt帮助文档,基本用不着这个软件。
Qt Designer是一个进行窗体可视化设计的工具软件。Qt Creator中也有一个内置的窗体可视化设计工具软件(本书称之为UI Designer),而且UI Designer可以为界面组件的信号生成槽函数框架,所以在本书中不使用这个独立的Qt Designer,而使用Qt Creator内置的UI Designer。
Qt Linguist是一个编辑语言资源文件的工具软件,在第11章介绍开发多语言界面的应用程序时会用到。
1.2.4 Qt Creator的设置
本书对使用的Qt Creator做了一些设置:一是将界面语言设置为英语,因为初始的汉语界面中某些词汇翻译得并不恰当,使用英语界面会更准确一些;二是设置文件命名规则,取消默认的全小写命名文件规则。
启动Qt Creator后,点击Qt Creator菜单栏的“Tools”→“Options…”菜单项打开如图1-8所示的选项设置对话框。
界面语言设置:点击对话框左侧Environment分组后,在Interface页面将界面语言设置为English,设置主题为Flat Light。更改语言和主题后需要重新启动Qt Creator才会生效。
文件命名规则设置:在图1-8所示的C++分组的File Naming页,取消“Lower case file names”选项。默认是勾选此项的,即自动命名的文件名采用全小写字母。
在本书里用Qt Creator只需要进行窗体可视化设计、生成槽函数代码框架、查阅Qt帮助文档,而不需要使用Qt Creator编写任何C++程序。Qt Creator的具体使用在下一章详细介绍。
图1-8 Qt Creator的选项设置对话框
1.3 PyQt5
1.3.1 PyQt5简介
Python语言功能很强,但是Python自带的GUI开发库Tkinter功能很弱,难以开发出专业的GUI。好在Python语言的开放性,很容易将其他语言(特别是C/C++)的类库封装为Python绑定,而Qt是非常优秀的C++ GUI类库,所以就有了PyQt。
PyQt是Qt C++类库的Python绑定,PyQt5对应于Qt5类库。Qt推出新的版本后,PyQt就会推出跟进的版本,例如针对Qt 5.12.0就有PyQt 5.12。使用PyQt5可以充分利用Qt的应用程序开发框架和功能丰富的类设计GUI程序。PyQt主要有以下一些优点。
PyQt将Qt的跨平台应用框架与Python的跨平台解释语言结合在了一起。
Qt使用信号与槽(Signals/Slots)机制进行对象之间的通信,它是类型安全且弱耦合的,易于创建可重用的软件模块。
使用Qt Creator中的UI Designer或独立的Qt Designer可以可视化地设计窗体,然后将窗体转换为Python程序,可以大大提高界面设计的效率。
PyQt将Qt和Python的优点结合到了一起,程序员可以利用Qt丰富的UI设计功能,但不需要使用复杂的C++语言,而是使用Python语言编程。
PyQt5是Riverbank公司的产品,分为开源版本和商业版本,开源版本就包含全部的功能。Riverbank公司不仅开发了PyQt5,还开发了PyQtChart、PyQtDataVisualization、PyQt3D、SIP等软件包。可以在Riverbank公司网站上下载这些软件包的源代码,在PyPI网站上也可以找到这些软件包,所以可以使用pip3指令直接安装。
1.3.2 PyQt5安装
在PyPI网站上可以找到最新版本的PyQt5,直接用下面的指令安装PyQt5。
?
pip3 install PyQt5
直接连接PyPI服务器可能速度比较慢,可以使用镜像网站安装,例如使用清华大学镜像网站的指令是:
?
pip3 install –i https://pypi.tuna.tsinghua.edu.cn/simple PyQt5
这条指令正确执行后就会安装PyQt5,并且会自动安装依赖的包SIP。SIP是一个将C/C++库转换为Python绑定的工具,SIP本来是为了开发PyQt而开发的,现在也可以用于将任何C/C++库转换为Python绑定。
安装PyQt5之后,在“D:\Python37\Scripts”目录下增加了pylupdate5.exe、pyrcc5.exe和pyuic5.exe这3个用于PyQt5的可执行程序,如图1-9所示。这3个可执行程序的作用分别如下。
pyuic5.exe是用于将Qt Designer(或Qt Creator内置的UI Designer)可视化设计的界面文件(.ui文件)编译转换为Python程序文件的工具软件,是使用PyQt5设计GUI程序最常用到的工具软件。
pyrcc5.exe是用于将Qt Creator里设计的资源文件(.qrc文件)编译转换为Python程序文件的工具软件,资源文件一般存储了图标、图片等UI设计资源。
pylupdate5.exe是用于多语言界面设计时编辑语言资源文件的工具软件。
图1-9 安装PyQt5之后的Scripts子目录下的可执行文件
路径“D:\Python37\Scripts”被添加到了Windows的PATH环境变量里,所以这些程序在cmd窗口里可以直接运行。
若想要卸载PyQt5,就执行下面的指令:
?
pip3 uninstall PyQt5
1.3.3 在IDLE中开启对PyQt5的代码提示功能
在安装了PyQt5之后,可以在IDLE中开启代码提示功能,并且添加PyQt5的所有模块,这样在编写程序时,IDLE就具有一定的代码提示功能。
首先编辑目录“D:\Python37\Lib\idlelib”下的文件config-extensions.def,修改[AutoComplete]部分:
?
[AutoComplete]
enable=True
popupwait= 20
这表示开启自动提示功能,提示开启的延迟时间是20毫秒。
然后再编辑同一目录下的文件autocomplete.py,在文件的import部分导入PyQt5的各个模块:
?
import os
import string
import sys
##添加需要自动提示的模块
import PyQt5.QtWidgets
import PyQt5.QtCore
import PyQt5.QtGui
import PyQt5.QtSql
import PyQt5.QtMultimedia
import PyQt5.QtMultimediaWidgets
import PyQt5.QtChart
import PyQt5.QtDataVisualization
这样就将 PyQt5 的各个常用模块以及第 12 章和第 13 章要单独安装的PyQtChart和PyQtDataVisualization加入了可提示模块列表。
开启和设置自动提示功能后,在IDLE中使用PyQt5各模块中的类时就会有代码提示功能。但是IDLE的代码提示功能比较弱,不如PyCharm、Eric等专业IDE软件。