共计 11548 个字符,预计需要花费 29 分钟才能阅读完成。
引言
找了很多 Python GUI 工具集,还是觉得 PyQt 比较理想,功能强大跨平台,还支持界面设计器。花一天时间折腾了 Ubuntu 14.04(32 位)+ Python3.4 + Qt5.3.2 + PyQt5.3.2 + Eric6.0 的完整开发平台的搭建,各种出错差点放弃了,好在终于一一解决了,记录下来以后搭建起来方便点。
安装 Python3.4
Ubuntu14.04 貌似默认安装了 Python2.7 和 Python3.4。故 Python3.4 的安装可略去。
安装 Qt5
Ubuntu14.04 自带 Qt4 的部分库文件,但是我们的平台要求 Qt5,所以首先安装 Qt5.
Qt5.3.2 下载:http://qt-project.org/downloads
安装过程:
下载到的是 Qt5 的在线安装程序,为其赋予可执行权限即可单击启动。由于我之前文件都安装在 /opt 目录下,故这里以 root 身份安装:
- sudo chmod a+x qt-opensource-linux-x86-1.6.0-5-online.run
- sudo ./qt-opensource-linux-x86-1.6.0-5-online.run
启动界面后默认安装即可。
配置过程:
安装完成后配置一下 PATH,在当前用户主目录下的.bashrc(or .zshrc)文件中加入:
- export QTDIR=/opt/Qt/5.3/gcc/
- export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${QTDIR}/lib
- export PATH=${QTDIR}/bin:${PATH}
注意 ${QTDIR}/bin 和 ${PATH}的顺序!因为 Ubuntu14.04 默认 ${PATH}路径中的 /usr/bin 下存在诸多 qt 命令(确切的说是指向 qtchooser 的软连接,qtchooser 最终会选择系统自带的 Qt4 命令:但是这些命令默认都不存在),如果 ${QTDIR}/bin 在 ${PATH}之后,会导致 Qt 命令失效。
特别是 qmake 命令,在后续安装中需要用到,保险起见,在终端输入 qmake,如果显示 qmake 命令不存在,请通过创建软连接进行解决:
将 /usr/bin 下的 qmake 软连接到 /opt/Qt/5.3/gcc/bin/qmake 上,或者将 /usr/lib/i386-linux-gnu/qt4/bin/qmake 软连接到 /opt/Qt/5.3/gcc/bin/qmake 上:
- sudo ln -s /opt/Qt/5.3/gcc/bin/qmake /usr/bin/qmake
- or
- sudo ln -s /opt/Qt/5.3/gcc/bin/qmake /usr/lib/i386-linux-gnu/qt4/bin/qmake
此时再输入 qmake 查看是否设置成功。
安装 SIP
SIP 是 python 调用 C /C++ 库的必备模块。因此 SIP 是 PyQt 的依赖工具,安装 PyQt 之前必须先安装对应版本的 SIP。PyQt 编译时使用的 SIP 版本必须与 python 默认调用的 SIP 保持一致!否则 python 中是无法调用 PyQt 的。这里我们使用最新的 SIP 4.16.3.
Ubuntu14.04 中貌似是自带 4.15 版的 SIP(or 自己安装 python 扩展是自动安装的)。终端输入:
- sip -V
查看已安装 SIP 版本,如果存在其他版本,请查看 python3 的 dist-packages 目录下是否存在 sip 相关文件。如果存在将其删除:
- sudo -rm /usr/lib/python3/dist-packages/sip*
然后正式安装 SIP 4.16.3。
SIP 4.16.3 下载:http://www.riverbankcomputing.com/software/sip/download
安装过程:
- tar -zxvf sip-4.16.3.tar.gz
- cd sip-4.16.3
- python3 configure.py
- sudo make
- sudo make install
配置过程:
SIP 无需配置,只是需要安装完成后注意核对一下版本:
分别在终端输入:
- sip -V
在 python3 环境输入:
- >>>import sip
- >>>print(sip.SIP_VERSION_STR)
查看二者显示的版本是否一致。如不一致,需要重新执行上述删除过程和安装过程。版本不一致将意味着后面编译 PyQt 所使用的 SIP 和 Python3 调用的 SIP 的不一致,导致在 Python3 中调用 PyQt 的相关模块(from PyQt5 import QtCore)出现类似如下错误:
- the sip module implements API v11.0 but the PyQt5.QtCore module requires API v11.1
安装 PyQt5
PyQt 是 Python 的一个跨平台图形开发工具集,是 Python 与 Qt 的成功融合。PyQt 包含了大约 440 个类、超过 6000 个的函数和方法,灰常强大。需要注意的是,Eric(一种 Python IDE,依赖 PyQt)当前最新的稳定版 Eric5 只支持 PyQt4(确切的说是 PyQt4.8 以上 5.0 以下),支持 PyQt5 的 Eric 版本现在仅为 Eric6.0 snapshot 版,该版本包含最新的 Eric5 的所有功能,但稳定性需要测试。如果你希望使用稳定的 Eric5,请在此步骤安装 PyQt4 的最新版 PyQt4.11.2。这里我们安装 PyQt5.3.2.
PyQt5.3.2 下载:http://www.riverbankcomputing.com/software/pyqt/download5
安装过程:
- tar -zxvf PyQt-gpl-5.3.2.tar.gz
- cd PyQt-gpl-5.3.2
- python3 configure.py
注意:此命令生成各种 Qt 模块后,其中的 QtWebKitWidgets 模块由于 Qt4 和 Qt5 的 qprinter.h 所属模块的调整(Qt4 存在于 QtGui 中,Qt5 将其调整到 QtPrintSupport 中了),QtWebKitWidgets 的 Makefile 中缺失了对 QtPrintSupport 的头文件目录引用,会导致后面编译 PyQt5 时无法找到 qprinter.h 头文件,编译失败(编译过程非常漫长):
- qprinter.h: No such file or directory
所以需要向刚生成的 QtWebKitWidgets 模块源文件的 MakeFile 文件的 INCPATH 中添加 QtPrintSupport 引用。
原 INCPATH 为:
- INCPATH = -I/opt/Qt/5.3/gcc/mkspecs/linux-g++ -I. -I. -I/usr/include/python3.4m -I/opt/Qt/5.3/gcc/include -I/opt/Qt/5.3/gcc/include/QtWebKitWidgets -I/opt/Qt/5.3/gcc/include/QtWebKit -I/opt/Qt/5.3/gcc/include/QtWidgets -I/opt/Qt/5.3/gcc/include/QtNetwork -I/opt/Qt/5.3/gcc/include/QtGui -I/opt/Qt/5.3/gcc/include/QtCore -I.
修改为:
- INCPATH = -I/opt/Qt/5.3/gcc/mkspecs/linux-g++ -I. -I. -I/usr/include/python3.4m -I/opt/Qt/5.3/gcc/include -I/opt/Qt/5.3/gcc/include/QtWebKitWidgets -I/opt/Qt/5.3/gcc/include/QtWebKit -I/opt/Qt/5.3/gcc/include/QtWidgets -I/opt/Qt/5.3/gcc/include/QtNetwork -I/opt/Qt/5.3/gcc/include/QtPrintSupport -I/opt/Qt/5.3/gcc/include/QtGui -I/opt/Qt/5.3/gcc/include/QtCore -I.
或者可以直接在 QtWebKitWidgets 模块源文件的 QtWebKitWidgets.pro 文件中加入:
- QT += printsupport
也行。
接下来执行编译安装:
- sudo make
- sudo make install
配置过程:
安装完成后进入 Python3 环境验证是否安装成功:
- >>>import PyQt5
如果提示不存在 PyQt5 模块,表示安装的 PyQt5 没有被 python3 正确识别。默认的安装路径为 python 的 site-packages 目录。通常 python3 的模块安装路径会分成 2 个,一个 /usr/lib/python3,一个 /usr/lib/python3.4,两个路径下的模块都能被 python3 环境正确调用,但是 python3.4 的 site-packages 目录下的模块貌似无法调用。PyQt5 偏偏默认安装到此目录了。解决办法是为其创建软连接,保险起见,python3 目录和 python3.4 目录分别创建一个:
- sudo ln -s /usr/lib/python3.4/site-packages/PyQt5 /usr/lib/python3.4/PyQt5
- sudo ln -s /usr/lib/python3.4/site-packages/PyQt5 /usr/lib/python3/dist-packages/PyQt5
可能不同的计算机上可识别的模块安装目录会存在差异,但是解决原理都差不多,在 python3 可识别模块的路径下创建 PyQt5 的软连接即可让 Python3 成功识别。
另外一个解决办法是在 python3 configure.py 时就指定安装目录。如:
- python3 configure.py –destdir /usr/lib/python3.4
安装 QScintilla2
QScintilla2 是连接编译器和 Python 的接口,因此是 Eric 的必需前置组件。QScintilla2 中需要单独安装 3 个模块:本体,Designer 和 python bingdings。
QScintilla2.8.4 下载:http://www.riverbankcomputing.com/software/qscintilla/download
安装过程:
- tar -xzvf QScintilla-gpl-2.8.4.tar.gz
- cd QScintilla-gpl-2.8.4
A. 安装本体:
- cd Qt4Qt5
- qmake qscintilla.pro
- sudo make
- make install
B. 安装 Designer:
- cd ../designer-Qt4Qt5
- qmake designer.pro
- sudo make
- sudo make install
C. 安装 Python bingdings:
- cd ../Python
- python3 configure.py –pyqt=PyQt5
- sudo make
- sudo make install
以上步骤即可正确安装 QScintilla2。需要注意的是 Python bingdings 安装时需要指定 –pyqt=PyQt5 参数,否则默认是为 PyQt4 安装。或者直接修改其 configure.py,将 pyqt5_is_default = False 改为 pyqt5_is_default = True 也可。
配置过程:
无需额外配置。
安装 Eric6
Eric 作为一款强大的开源 Python IDE,支持 Qt 界面设计器的 Eric 在 Python GUI 开发中更是首屈一指,Python+PyQt+Eric 已经成为一种标准的 Python GUI 开发平台。其中 Eric4 支持 Python2.6+ 与 PyQt4.6+ 组合,Eric5 支持 Python3.0+ 与 PyQt4.8+ 组合,Eric6 支持 Python3.0+ 与 PyQt5.0+ 组合。目前 Eric5.4.7 为最新稳定版。Eric6.0 为 snapshot 版。上文已有介绍。具体搭配可参考:http://eric-ide.python-projects.org/eric-download.html。这里安装 Eric6.0.
Eric6.0 下载:http://sourceforge.net/projects/eric-ide/files/eric6
/unstable/
下载其中的eric6
-6.0-snapshot-20140720.tar.gz 主文件和eric6
-i18n-zh_CN.GB2312-6.0-snapshot-20140720.tar.gz 中文语言包。
安装过程:
- tar -zxvf
eric6
-6.0-snapshot-20140720.tar.gz - tar -zxvf
eric6
-i18n-zh_CN.GB2312-6.0-snapshot-20140720.tar.gz // 语言包文件会自动解压到 Eric6.0 主文件解压目录中。没有的话手动复制。 - cd
eric6
-6.0-snapshot-20140720 - sudo python3 install.py // 安装主程序
- sudo python3 install-i18n.py // 安装中文语言包
应该能够顺利安装完成。
需要注意,由于是以 root 身份安装(sudo),所以运行时需要执行:
- sudo
eric6
才不会导致 Eric 运行或者关闭时写入配置文件出错(sudo 安装的 Eric6 的文件都是 root 所有,其他用户执行 Eric6 写入配置文件时权限不足)。为了保证直接执行:
eric6
时不致出错,可以将当前用户的 eric6
目录权限设置为可读写:
- sudo chmod a+w -R ~/.
eric6
- sudo chmod a+w -R ~/.config/Eric6
或者安装时就直接
- python3 install.py
- python3 install-i18n.py
就无需 sudo 执行了。但是不推荐这样做。
配置过程:
终端输入 eric6
启动:
1、选择 Settings -> preference -> Editor -> Autocompation。勾选所有选框;
2、选择 Settings -> preference -> Editor -> QScintilla。勾上左右的两个选框,然后在下面 source 中,选择 from Document and API files;
3、选择 Settings -> preference -> Editor -> APIs。勾选 Complie APIs Autocompation,在 Language 中,选择 python3。点面下面的 Add from installed APIs 按钮, 选择住需要的.api 文件。最后点击 Compile APIs;
4、选择 Settings -> preference -> Interface -> Interface。右侧 Language 根据喜好选择中文或者 English。重启生效。
配置完成。
Demos
提供 2 个简单的 Demo 验证平台是否正确搭建。
A. 非 Eric 小程序:
- #!/usr/bin/env python
- from PyQt5.QtWidgets import (QApplication, QLabel)
- import sys
- if __name__ == “__main__”:
- app = QApplication(sys.argv)
- label = QLabel(“<center>Hello World with PyQt5!</center>”)
- label.resize(200, 50)
- label.show()
- sys.exit(app.exec_())
B. Eric 小项目:
此部分转自:http://www.pythoner.com/89.html
1、新建项目。
点击【项目】-【新建】,弹出如下的对话框。创建一个名为 demo2 的项目。注意,在创建项目时,eric 不会自动根据填写的项目名称修改项目文件夹名称!
点击确定之后,可以看到一个源代码树中只有__init__.py 的项目。另外,eric 还创建了几个文件,但是并不会在这里显示出来,他们分别是项目文件”pyqtdemo.e4p”和”_eric4project”文件夹。
2、新建窗体。
将左侧的【源代码】选项卡切换至【窗体】选项卡(左数第二个)。右键空白区域,选择【新建窗体】。在弹出的对话框中选择【对话框】。在弹出的文件对话框中,选择文件位置,并填写文件名称。这里,我们将其命名为 demo2.ui。确定后,就可以看到【窗体】选项卡中,有一个 demo2.ui 文件了。
3、设计窗体。
右键点击“pyqtdemo.ui”文件,选择【在 Qt 设计师中打开】,就可以在 Qt Designer 中设计 UI 界面了。
从图中可以看到,Qt Designer 分为如下几个部分:
- 菜单栏:包括文件、编辑、窗体、视图、设置、窗口和帮助。
- 工具栏:包括文件操作、部件前后置、编辑窗口部件、编辑信号 / 槽、编辑伙伴、编辑 Tab 顺序、布局方式、调整大小等。
- 部件栏:包括各种可用部件。
- 窗体设计区域
- 对象查看器:可以查看各部件对象关系树及其所属的类
- 属性编辑器
- 信号 / 槽编辑器
- 动作编辑器
- 资源编辑器
3.1、修改窗体属性
默认的窗体属性中,objectName(部件名称,其他程序引用时使用)默认为 Dialog,windowTitle(窗体标题)默认也是 Dialog。我们可以根据自己的需要,对对话框的各个属性进行修改。这里,我只修改了 windowTitle 为“PyQt Demo”,并改变了其大小。
3.2、添加部件
从左侧的 widget box 中拖出 3 个 PushButton,1 个 label。修改它们的 objectName、text 等属性。其中 3 个 PushButton 的 ObjectName 分别为 btn1、btn2、btnClose。
添加后的效果图,如下图所示:
4、信号与槽
4.1、概念
在 PyQt5 中,事件处理的相关术语为“信号(signal)”和“槽(slot)”。
信号的含义就是我们常说的事件,比如按钮被按下、复选框勾选状态变更、可输入文本框文本变更等等。
槽的含义则是事件处理函数,比如关闭窗体、隐藏窗体、最大 / 小化、设置焦点、重绘等。
4.2、使用一个自带的槽
我们从工具栏中,选择【编辑信号 / 槽】。
拖动要编辑的部件,会出现一个类似于电路中接地符号的标志,并弹出对话框。
这里,我们选择 clicked(),即按钮被按下,此时看到右侧可选的槽并不多,并且没有我们希望使用到的关闭功能。
勾选【显示从 QWidget 继承的信号和槽】,这时可以发现,右侧的槽多了很多。在其中找到 close(),点击确定。此时,点击【关闭】按钮执行对话框关闭的功能就已经实现了。
下图是已经创建了【关闭】按钮槽之后的窗体设计图。
4.3、第一次运行
虽然只实现了一个关闭功能,但是还是让我们先来看看如何运行这个到目前为止一行代码都没有写过的程序吧。
现在回到 eric 的界面,右键“demo2.ui”,选择【编译窗体】。
短暂的时间过后,可以看到编译成功提示。这时,我们切换到【源代码】选项卡,可以看到一个名为 Ui_demo2.py 的文件,这就是根据刚才那个 ui 文件自动编译而成的,我们不需要对其进行任何修改,也不应当对其进行任何修改,因为,任何对这种文件,在下次编译后,之前的修改会全部不存在。
看,下图,就是我们第一次运行时的场景。在 eric 里,我们可以 F2 直接运行,或 F5 进行调试。当按下【关闭】的时候,窗体就会被关闭。
4.4、创建自定义槽
使用自带槽的方式很简单,然而,它所能实现的功能也是有限的,在我们的开发中,绝大多数信号发生时,不会使用默认的槽。因此,这一小节将通过按钮 1、2 的实现来介绍如何创建一个自定义槽。
自定义槽,就要求自己写其中的槽函数,而之前的操作中,我们还没有动手写过一次代码,那么这个槽的代码写在哪里呢?
我们再切换回【窗体】选项卡,右键 demo2.ui,选择【生成对话框代码】。
首先,点击【新建】,新建一个类,在这里可以修改类名、文件名和路径。
然后在下面的选框中,选择自己需要使用到的信号。比如,我的选择如下图所示,是两个按钮被按下时的信号:
这时,就生成了一个默认的代码。对这个代码进行修改,实现预期的内容。
5、完成
修改之后代码和运行界面如下:
(完)
Ubuntu 12.04 安装 PYQT4 和 Eric4 http://www.linuxidc.com/Linux/2012-10/72417.htm
Ubuntu 下安装配置 Python 3.2.3 集成开发环境 Eric5 http://www.linuxidc.com/Linux/2012-04/59170.htm
相关文档:PyQt4 入门指南 下载见 http://www.linuxidc.com/Linux/2012-06/63651.htm
推荐学习:PyQt4 精彩实例分析 http://www.linuxidc.com/Linux/2012-06/63652.htm
CentOS 上源码安装 Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm
《Python 核心编程 第二版》.(Wesley J. Chun).[高清 PDF 中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm
《Python 开发技术详解》.(周伟, 宗杰).[高清 PDF 扫描版 + 随书视频 + 代码] http://www.linuxidc.com/Linux/2013-11/92693.htm
PyQt 的详细介绍:请点这里
PyQt 的下载地址:请点这里
更多 Ubuntu 相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-12/126176.htm
![post-qrcode](https://www.xgss.net/wp-content/uploads/2023/07/二维码-微信公众号256x256.jpg)