简介
写在最前面的话
在决定学习、使用一个框架之前需要考量如下几点:
- 框架运行效果;
- 框架应用范围;
- 框架学习成本和迁移成本;
- 实现自己所需功能的开发效率;
只有综合考量如上四个方面,才能更好地选择适合自己的框架;
Python GUI 框架介绍
TK
Tkinter 是 Python 内置的 GUI 框架,创建 Tkinter 的目的是为了给现代开发人员提供 Tk GUI 工具包的标准接口和它的 Python 绑定,它唯一的优点就是简单无依赖,TK 的入门门槛很低,但是精通难度大,它最大的问题是布局,不同于 PyQt 的布局管理器,TK 的布局完全使用代码实现,就开发效率而言较低,且它只提供 15 种控件,扩展性差。
PyQt
这个框架是本人首推的 Python GUI 框架,PyQt 是 Qt 框架的 Python 版本,Qt 本身是一个十分成熟的商业 GUI 框架,底层使用 C++进行开发。PyQt 是 Python 对 Qt 的包装,具有扩展性强、跨平台、显示效果好的优点,其次 PyQt 的接口和 Qt 的完全一致,所以采用 PyQt 开发 GUI 后期可以转 C++开发 Qt。需要注意的是,PyQt 有两种许可协议,分别是 GPLv3许可证和需要购买版权的商业许可证,GPLv3是强开源协议,意味着,如果你的应用程序里面使用了 PyQt,那么你的程序必须开源,否则法院传票了解一下,因此如果想要闭源商用,必须购买 Riverbank Computing 公司的商业许可证,目前 PyQt 已经推出了 PyQt 6,在 PyQt 5 的基础上对部分模块进行了升级,并添加一些新功能。
PySide 2
如果你既想享受 Qt 的强大功能,又想闭源商用,那么 PySide 完全适合你,说到 PySide,就不得不说,Qt 与 PyQt 之间的恩怨,Qt 的研发公司是 Nokia,Riverbank Computing 公司使用 Python 封装了 Qt 研发出 PyQt,而 PyQt 从诞生时就是 GPLv3协议,因此 Nokia 与 Riverbank Computing 谈判,希望将 PyQt 的协议修改为 LGPLv3,可以带来更多的商业用户,但是两个公司谈崩了,所以 Nokia 自己重新研发了 Py 版本的 Qt 也就是 PySide,后来 Nokia 将 Qt 和 PySide 卖给了 Digia 公司,后来在 Digia 公司与开源社区的支持下,目前 Pyside 已经迭代到 PySide6了,对应 PyQt6,注意 PyQt5的对应版本是 PySide2,因为 PySide 推出的比较晚,因此第二代 Pyside 就对齐了 PySide6。对于 Pyside6,由于是官方推出的,并且可以闭源商用。二者的函数接口完全一致,所以文档基本也是可以互相参考,因此还是比较强推 PySide6的。
WxPython
WxPython 是一个流行的跨平台 GUI 工具包。由 Robin Dunn 和 Harri Pasanen 共同开发,它的本质是 wxWidgets(使用 C++编写) 的 Python 包装。相比于 PyQt 模块,WxPython 模块的文档较少,功能相对较弱。
Pygtk
python 对 GTK+GUI 库的封装,在 linux 平台上运行的比较好,需要安装扩展模块,在 windows 下的兼容性有一些问题。
PyQt
推荐 PyQt 的原因
- 文档丰富;
- 学习成本低,后期迁移成本低;
- 开发效率高,开发人员可以使用 Qt-designer 进行拖拽布局;
- 开发经验可以迁移到 pyside 进行商业软件开发;
环境搭建
基本环境
- Windows 11,64 位;
- Python 3.8.6;
安装 PyQt
直接使用 pip 进行安装,参考文档
pip install PyQt5
pip install pyqt5-tools
如果下载速度过慢可以使用国内镜像
pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple
Pycharm 环境配置
Qt Designer 是用于设计和构建图形用户界面的 Qt 工具。它允许使用屏幕上的表单和简单的拖放界面设计控件、对话框或完整的窗口。Qt Designer 使用 XML 格式的 .ui
文件储存 GUI 界面文件,本身不会生成任何代码,.ui
文件可以通过pyuic工具转换为 .py
文件。
这里稍微扩展一下,Qt 框架本身包含 uic utility 可以从 .ui
文件生成 C++代码。其次 Qt 框架还包含 QUiLoader 类,该类可以在应用程序中动态加载 .ui
文件。PyQt 5 只包含了 uic Python 模块,可以动态加载 .ui
文件,也可以将 .ui
文件转换为 .py
文件,pyuic工具本质上是 uic Python 模块的接口,命令格式如下:
pyuic [options] <uifile>
常用选项如下:
-p
:动态创建并显示 GUI,不会生成 Python 代码;-o <filename>
:生成的 Python 代码将输出到指定文件;--version
:输出版本号;-i <N>
:指定代码缩进格数;-h
:将帮助信息输出;
PyQt 5 支持 Qt 的资源系统,用于将起源嵌入到应用程序中,方便分发和打包资源,.qrc
文件是一个资源集合,使用 XML 文件描述存储的资源,用于指定需要被嵌入到应用程序中的资源文件。应用程序会以冒号作为开头,通过资源文件的原始名称引用相应的文件。
为了将 .qrc
文件转换成 .py
文件,需要使用pyrcc 5工具,该工具和 pyuic 工具是一致的,pyrcc5 会读取 .qrc 文件和资源文件,并生成相应的 Python 模块。只需要在应用程序中 import 相应的 Python 资源模块,便可以像使用原始文件一样,使用相应的资源。
综上,为了配置 Pycharm 环境,我们需要配置 3 样东西:
- Qt Designer;
- Pyuic;
- Pyrcc;
Qt Designer
在 Pycharm 中,依次打开 File → Settings → Tools → External Tools,点击 + Create Tool,配置如下:
Name:QtDesigner
Program:D:Python38\Lib\site-packages\PySide2\designer.exe(请根据实际修改)
Working directory: $FileDir$
Pyuic
在 Pycharm 中,依次打开 File → Settings → Tools → External Tools,点击 + Create Tool,配置如下:
Name: Pyuic
Program: D:\Program Files\Python38\python.exe(请根据实际修改)
Arguments: -m PyQt5.uic.pyuic $FileName$ -o Ui_$FileNameWithoutExtension$.py
Working directory: $FileDir$
Pyrcc
在 Pycharm 中,依次打开 File → Settings → Tools → External Tools,点击 + Create Tool,配置如下:
Name: PyRCC
Program : D:\Python38\Scripts\pyrcc5.exe(请根据实际修改)
Arguments: $FileName$ -o $FileNameWithoutExtension$_rc.py
Working directory: $FileDir$
第一个程序
在 Pycharm 中打开 Qt-Designer。
在左侧控件栏中搜索 Label 控件,将控件拖拽到窗口中间,并更改其中的文字为 hello world,PyQt5
。保存文件为 demo 1_helloworld。
使用pyuic工具将 .ui
文件转换成 .py
文件,输入以下代码:
import sys
from PyQt5.QtWidgets import *
from UI.Ui_demo1_helloworld import Ui_MainWindow
# 继承基类和自己写的UI类
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
if __name__ == '__main__':
app = QApplication(sys.argv) # 创建APP
win = MainWindow() # 创建主窗口
win.show() # 显示窗口
sys.exit(app.exec()) # 程序运行
运行程序,结果如下:
至此,我们迈出了第一步,完成了第一个 PyQt 程序!!!
文中难免会出现一些描述不当之处(尽管我已反复检查多次),欢迎在留言区指正,相关的知识点也可进行分享,希望大家都能有所收获!!