11. 应用开发:Python 和 PySide6
🤖 作者:包瑞清(richie bao): lastmod: 2025-01-31T10:20:47+08:00
11.1 Python 应用开发工具
支持 Python 编程语言进行图形用户界面(GUI)开发的工具有Tkinter、PyGObject、PyQt、PySide6、Kivy、wxPython和Dear PyGui等。下面例举了几个主要的 Python 应用开发工具。
- PySide6
PySide6是 Qt框架的 Python 绑定,基于 Qt6 版本构建,支持各种高级图形和用户界面功能,提供了一个用于开发跨平台桌面应用程序的完整工具集。PySide6 主要特点有:
- 跨平台支持:支持 Windows、macOS 和 Linux 等主流操作系统,允许开发者创建跨平台应用程序。
- 面向对象编程:采样面向对象的编程范式,提供了大量的控件(如按钮、文本框、标签、树形视图等)和功能组件。
- 丰富的控件库:UI 组件丰富,包括但不限于:按钮、文本框、列表视图、表格视图、图形视图、图形项等。支持复杂的布局管理,方便开发者设计高度定制化的界面。
- 集成图形和 2D/3D 渲染:除了常规的 GUI 控件,PySide6 还支持图形渲染,适用于需要高度定制化或具有交互性的图形界面。
- 事件系统:通过信号(Signals)和槽(Slots)机制,支持事件驱动的编程模型,使得用户交互流程和高效。
- Qt Designer 继承:PySide6 可以与 Qt Designer 配合使用。Qt Designer 是一个可视化的界面设计工具,可以快速拖拽控件,生成
.ui
文件,并通过pyside6-uic
工具转换为 Python 代码。 - 多语言支持:通过 Qt 的翻译功能,支持多语言环境,轻松创建本地化应用。
- 性能:PySide6 继承了 Qt 的高性能特点,适合开发需要复杂图形界面或高性能需求的桌面应用。
PySide6 适合于开发文本编辑器、图形设计工具等桌面应用;管理软件、分析工具等企业级应用;显示实时数据、图表和图形的数据可视化应用;支持2D、3D 图形、OpenGL 等,适用于需要图形渲染的图形界面开发。
- Tkinter
Tkinter 是 Python 的标准 GUI (图形用户界面)库,是对 Tcl/Tk GUI 库的封装。由于 TKinter 简单、轻量级的特性,成为 Python 开发者常用的 GUI 开发工具之一。Tkinter 的主要特点有:
- 轻量级和内置库:Tkinter 是 Python 的标准库之一,意味着不需要安装任何额外的依赖包,直接就可以在 Python 环境中使用。
- 跨平台支持:支持 Windows、macOS 和 Linux 等操作系统。通过 Tkinter 可以开发跨平台的桌面应用。
- 简洁易学:Tkinter 设计上非常简单,提供了基本的 GUI 控件,如按钮、标签、文本框、菜单等,并支持基本的事件驱动编程,适合初学者快速上手。
- 事件驱动编程模型:使用事件驱动的模型,支持通过回调函数来响应用户的输入(如点击按钮、键盘输入等)。
- 基础控件:提供的控件包括:按钮、标签、文本框、单选框、复选框、列表框、滚动条、菜单等。Tkinter 的控件相比 PySide6 和其他 GUI 库少,适用于简单的应用。
- 布局管理:支持三种布局管理方式:
pack()
、grid()
和place()
,这些布局方式使得开发者能够控制控件的排布和大小。 - 内建对话框:提供了一些标准的对话框,如文本选择对话框、消息框、颜色选择对话框等,可以帮助开发者快速实现常见的功能。
- 不支持高级图形功能:与 PySide6 等框架不同,Tkinter 不支持复杂的图形渲染(如 OpenGL 渲染、2D/3D 渲染等),仅适合制作基本的桌面工具。
- 相对较低的性能:性能适合小型应用,不适合于复杂界面或需要高性能的应用。
Tkinter 适用于开发如计算器、文本编辑器等小型应用的桌面工具;由于 Tkinter 简单易学,可以快速开发原型,验证想法;也适合于作为 Python 编程初学者的教育和学习工具。
- Dear PyGui
Dear PyGui(DPG)是一个易于使用、动态,GPU 加速,跨平台的 Python 图形用户界面工具包(GUI)。功能除了包括传统的 GUI 元素,如按钮、单选按钮、菜单和各种创建功能布局的方法外,DPG 还支持各种动态绘图、表格、绘图、调试器和多个资源查看器等功能。DPG 的主要特点有:
- 图形渲染:DPG 提供了 OpenGL 支持,能够进行高效的图形渲染,处理复杂的图形界面和动态图形,适合开发需要强大图形处理能力的应用。
- 性能:由于基于 OpenGL,具有较高的性能,特别是在需要频繁更新界面的应用中,可以处理实时渲染的交互式应用,如图形编辑器、数据可视化等。
- 简洁的 API:DPG 的 API 设计简洁直观,可以快速上手,并提供了许多内建控件(如按钮、输入框、进度条、图形视图等)和布局管理功能。
- 实时交互:DPG 专为需要动态更新的应用设计,支持快速更新 UI 元素,适用于实时数据可视化、动态交互等场景。
- 内建主题支持:提供了一些内建的 UI 主题,可以帮助开发者快速设计具有现代感的界面、且支持自定义主题。
- 阔平台支持:支持 Windows、macOS 和 Linux 等主流操作系统,能够开发跨平台的桌面应用。
- Python API 和 C++ 绑定:提供了 Python API ,同时也支持 C++ 接口,这为需要更高性能或需要与其它 C++ 库集成的开发者提供了便利。
- 绘图和图形控件:DPG 提供了绘图功能,可以绘制 2D 图形、文本、曲线、图表等,适合于数据可视化和图形编辑工具。
- 事件驱动编程模型:采用事件驱动模式,支持响应用户的输入事件,配合回调函数可以实现交互式界面。
- 开发工具:内置了开发者调试工具,可以帮助开发者在开发过程中调试界面和渲染过程。
Dear PyGui 适用于构建动态显示实时数据、绘制图表、仪表盘等数据可视化应用;图形设计工具、3D 建模工具等图形编辑器;用于开发游戏引擎的开发工具、编辑器等游戏开发工具;创建需要频繁更新和高交互性的实时控制界面;需要动态显示复杂设计结果的实验室软件、仿真系统等,为开发科学、工程、游戏、数据科学和其它需要快速交互界面的应用程序提供了基础框架。
PySide6,Tkinter,Dear PyGUI 三种 GUI 应用开发工具的比较。
表 11-1 GUI 应用开发工具比较
特性 | PySide6 | Tkinter | Dear PyGui |
---|---|---|---|
库类型 | 图形用户界面(GUI)框架 | 标准GUI库 | 图形用户界面(GUI)库 |
开发者 | Qt Company | Python 官方(由 Tcl/Tk 提供支持) | Dear PyGui 团队 |
支持的操作系统 | 跨平台(Windows、macOS、Linux) | 跨平台(Windows、macOS、Linux) | 跨平台(Windows、macOS、Linux) |
编程范式 | 面向对象 | 事件驱动式 | 事件驱动式 |
易用性 | 复杂,但功能丰富,适合专业开发者 | 简单,适合快速开发,学习曲线较平缓 | 现代且易用,适合开发高效的图形应用 |
支持的控件 | 提供大量控件(按钮、文本框、树形视图、表格等) | 提供基本控件(按钮、标签、文本框等) | 提供现代控件(按钮、进度条、输入框等) |
界面设计工具 | 支持Qt Designer(可视化设计工具) | 没有可视化设计工具 | 没有可视化设计工具 |
性能 | 高性能,适合复杂应用开发 | 较低,适合小型应用 | 性能较好,适合游戏和高效图形应用 |
文档和社区支持 | 强大,Qt社区活跃 | 非常活跃,文档完善 | 社区相对较小,但活跃 |
开源与商业 | 开源(LGPL),也有商业授权版本 | 完全开源 | 完全开源 |
跨平台支持 | 完全支持 | 完全支持 | 完全支持 |
高级特性支持 | 动画、绘图、2D/3D渲染、WebView等 | 不支持高级特性 | 支持现代图形功能和动态UI |
学习曲线 | 较陡,功能多但需要时间掌握 | 简单,适合初学者 | 简单易用,但也有一些高级特性 |
应用场景 | 桌面应用,复杂的企业级应用 | 小型桌面工具和快速原型开发 | 游戏工具,实时交互应用,快速原型开发 |
扩展性 | 高,支持与其他Qt库的集成 | 较低,扩展功能有限 | 高,支持Python、C++等多语言绑定 |
图形渲染与交互性 | 支持2D/3D图形渲染,适合复杂图形应用 | 不支持图形渲染,适合简单应用 | 高效的实时渲染和图形交互,适合动态图形和数据可视化 |
内置图形支持 | 支持 OpenGL 和图形视图组件 | 无内置图形支持 | 强大的2D/3D图形绘制能力,适合动态图形界面 |
适用领域 | 企业级应用、大型桌面应用 | 小型工具、快速原型开发 | 数据可视化、游戏工具、实时交互应用 |
11.2 PySide6 与 QtCreator
11.2.1 Python 虚拟环境下安装 PySide6
Python 虚拟环境(Virtual Environment)是一个独立的工作环境,可以在其中安装和使用特定版本的 Python 包和库,而不会影响到系统全局的 Python 环境,有益于管理项目的依赖和避免版本冲突。
11.2.1.1 使用 Python 官网的安装包
- (安装 Python)从 Python 官网 下载对应系统的最新 Python 安装程序(试验中使用 Windows 系统)。安装过程中确保同时勾选了
pip
项,以方便下载和安装其它 Python 包。同时,需要注意勾选Add Python to environment variables
(或为Add Python to PATH
),这将允许从系统命令行(Terminal/PowerShell)中使用Python
和pip
命令。 - (创建虚拟环境)安装 Python 完成后,按
Win + R
,敲入cmd
或powershell
打开 Terminal/PowerShell(或在开始Start
图标上右键弹出菜单选择 Terminal)。在命令行中用cd
命令定位到需要创建 Python 虚拟环境的文件夹路径下,如cd C:\Users\richie\Omen_RichieBao\omen_APP\PySide6_cases\envs
;然后执行python -m venv env-venv
创建虚拟环境,env-venv
为示例中自定义的虚拟环境名称。创建完成后可以在目标文件夹中查看生成的文件。 - (激活虚拟环境)在命令行(Command Prompt)中敲入
env-venv\Scripts\activate
或在 PowerShell 中敲入.\env-venv\Scripts\Activate
,运行激活新建的虚拟环境。如果要退出虚拟环境,则执行deactivate
命令。 - (安装 PySide6)在命令行中执行
pip install pyside6
,安装最新版 PySide6 库。 - (测试)为了测试新建 Python 虚拟环境的 pySide6 库是否正常安装。使用Visual Studio Code书写如下代码,并存储至本地磁盘,命名为
pySide6_test.py
。
通过打印版本信息来测试安装。执行上述 Python 代码文件,在激活的虚拟环境命令行中,定位到该文件所在文件夹,执行python pySide6_test.py
,获得输出结果为6.8.2
,表明虚拟环境和 PySide6 均安装成功。
上述创建 Python 虚拟环境所用的 venv模块支持创建轻量级的“虚拟环境”,每个虚拟环境都有自己独立的 Python 包集合,安装在各自的站点目录中。虚拟环境是在现有的 Python 安装基础上创建的,这个安装被称为虚拟环境的“base(基础)” Python,并且可以选择性地与基础环境中的包隔离,这样只有那些明确安装在虚拟环境中的包才可用。
除了使用 Python 标准库中的模块venv
创建 Python 虚拟环境,也可以使用第三方工具virtualenv,但必须先在终端中通过pip install virtualenv
安装virtualenv
。然后定位到要创建虚拟环境的文件夹路径下,执行virtualenv env_virtualenv
创建名为env_virtualenv
的虚拟环境。虚拟环境的激活方法和 PySide6 库安装同venv
步骤。因为venv
为 Python 标准库的一部分,无需额外安装,为官方推荐的虚拟环境工具。如果需要更多控制选项,如选择 Python 版本,默认隔离环境等,则可以考虑使用virtualenv
。
11.2.1.2 使用 Anaconda
从Anaconda官网下载 Distribution 版本安装。安装后打开 Anaconda, 在Environments
下点击Create
按钮,根据提示创建新的 Python 虚拟环境。Anaconda 创建的虚拟环境通常位于 Anaconda 安装路径下的envs
文件夹下。新创建的虚拟环境会显示在Environments
页面中,在其上点击右侧向的一个箭头打开弹出菜单,选择Open Terminal
打开终端,敲入pip install pyside6
运行安装 PySide6。
Anaconda 是一个开源的 Python 和 R 语言的数据科学和机器学习平台,旨在提供一个统一的环境,用于开发、运行和管理科学计算、数据分析、机器学习和大数据处理等应用程序。Anaconda 提供了conda
包管理工具,允许用户安装、更新和卸载 Python 包和环境;创建和管理不同的虚拟环境,避免不同项目之间的依赖冲突。在 Anaconda 中可以安装 Spyder, 一个专为数据科学设计的 Python 集成开发环境(IDE),提供了调试工具、交互式控制台和可视化功能等。
11.2.2 Qt Creator
Qt Creator 是一个跨平台的集成开发环境(IDE),专为开发使用 Qt 框架的应用程序而设计,用于开发 GUI 应用程序,支持跨平台开发,适用于 Windows、macOS 和 Linux 操作系统。Qt Creator 作为 Qt 官方推荐的 IDE,提供了一系列功能,帮助开发者高效的创建 Qt 应用程序。Qt Creator 主要特点有,
- 跨平台支持:支持多种操作系统(Windows、macOS、Linux)和不同的编译器,如 GCC、Clang 和 MSVC等,允许用户在不同平台上开发、编译和调试应用程序。
- 集成的 Qt 框架:提供了对 Qt 库的完整支持,帮助开发者快速使用 Qt 提供的各种功能(如 GUI、网络、数据库、3D图形等)。
- 图形化界面设计:内置了 Qt Designer,一个可视化界面设计工具,允许开发者通过拖放方式创建应用程序的 GUI,以便快速布局窗口、控件,并生成相应的代码。
- C++ 和 Python 支持:支持 C++ 和 Python 编程语言,使用 Python 时,是基于 PySide6 库创建应用。在选择模板时选择
Application(Qt for Python)
。 - Qt Quick 和 QML 支持:支持用于创建动态、响应式界面的框架 Qt Quick 和 Qt 的声明性编程语言 QML,以便帮助开发者更快的开发现代化的应用界面。
- 调试器和分析工具:集成 GDB 调试器、LLDB 支持和代码分析工具(如 Valgrind),可以辅助进行深度调试,查看内存泄漏、性能瓶颈等。
- 版本控制系统支持:集成如 Git、Bazaar 和 Mercurial 等版本控制工具,方便管理代码、进行团队协作。
- 性能分析:内置性能分析工具,如 Qt Creator Profiler,帮助分析应用程序的性能瓶颈。
Qt Creator 适合于开发桌面 GUI 应用程序,包括对跨平台的支持;也广泛用于嵌入式设备开发,Qt Creator 提供对嵌入式目标的调试和部署支持;结合 Qt Quick 或 QML 开发现代化、响应式的应用界面,支持实时预览和动态调试。
安装 Qt Creator 可以通过使用包管理器(Package Managers)安装(命令行)或直接下载安装包(Installation Packages)安装。如果使用包管理器,在 Windows 终端系统命令行中输入choco install qtcreator
;在 macOS 中输入brew install --cask qt-creator
进行安装。或从 https://download.qt.io/official_releases/qtcreator/latest/ Qt 官网下载 .exe
(Windows)等安装程序直接安装。可以从 Qt Creator 的 GitHub 代码托管查看源码或获取相关信息。
11.3 创建项目和Hello world!
11.3.1 创建项目
打开 Qt Creator,在欢迎页面(Welcome to Qt Creator)下选择 Create Project...
创建项目,根据新建项目向导完成项目建立。
步骤 | 用户界面 | 说明 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 |
|
Qt Creator 的欢迎页面,主要用于快速访问项目、示例、教程和其它资源;并可以选择创建一个新项目或打开一个现有项目;底部工具栏包含了快速访问编译、终端输出和其它与项目相关任务的标签。当前尚没有创建任何项目。 |
||||||||||||||||||||||||||||
2 |
|
可以通过选择不同的项目模板来创建项目。每个模板都有详细的描述和支持的平台信息,帮助开发者根据需求选择合适的项目。这里选择 |
||||||||||||||||||||||||||||
3 |
|
在该向导界面配置项目名称和存储位置。可以将当前路径设置为默认的项目位置。 | ||||||||||||||||||||||||||||
4 |
|
当前界面是 Qt Creator 的类定义界面,在此选择定义项目的基类(Base class)。可选项包括
|
||||||||||||||||||||||||||||
5 |
|
|
||||||||||||||||||||||||||||
6 |
A
B
C
D |
A. 当前界面为 Qt Creator 的工具包选择(Kit Selection)界面,需要在此为项目选择合适的构建工具包。如果未找到合适的工具包,系统会提示通过选项( B. 工具包是 Qt Creator 中用于构建和运行项目的重要配置,需要根据项目需求选择合适的工具包。 C. 因为选择 Qt for Python(PySide6)创建 GUI 应用程序,因此从左侧列表中选择 D. 此时可以选择新创建的工具包 |
||||||||||||||||||||||||||||
7 |
|
当前界面是 Qt Creator 项目总结界面,可以确认项目的配置和文件结构,检查项目的基本信息,及配置版本控制,这里选择了
|
||||||||||||||||||||||||||||
8 |
A
B
C |
A. 完成项目的创建,生成有一个典型的 PySide6 应用程序的模板。 B. Qt Designer 可视化界面设计工具,通过拖放方式创建应用程序的 GUI。 执行界面左下角右向绿色三角形图标按钮(或 |
11.3.2 Hello world!
基于上述创建的典型 PySide6 应用程序模板,增加显示一个带有文本“Hello world!”的标签,并为该标签设置字体和颜色,如图11-1。
图 11-1 Hello world! 应用界面
文件 | widget.py | ui_form.py | firstQtWidgetApp.pyproject |
---|---|---|---|
代码 |
|
|
|
🤖 代码解读 |
|
这段代码是通过
|
11.4 信号(Signals)与槽(Slots)
11.4.1 一个简单的按钮
信号(signals)和槽(slots)是 Qt 一个特性,为对象之间通信的机制,允许控件之间或与 Python 代码之间进行通信。信号用于发出某种事件的通知,而槽则是处理这些事件的函数,通过QObject
的connect
方法将信号与槽连接。当一个信号被发射时,任何连接到该信号的槽都会被调用。这里实现了一个简单的 PySide6 GUI 窗口,包含一个按钮(按钮点击触发信号)和一个标签(接收槽函数处理后的结果)。点击按钮时,标签会显示一段文本,按钮的文本也会更新。
图 11-2 一个简单的按钮
文件 | widget.py |
---|---|
代码 |
|
🤖 代码解读 |
|
11.4.2 信号与槽
由于 Qt 的特性,QObject
需要一种通信方式,因此信号和槽机制成为 Qt 核心功能之一。简单来说,可以将信号和槽理解为与家中灯光的互动。当灯的开关(信号)被操作时,结果可能是灯泡被点亮或熄灭(槽)。在上述一个简单的按钮示例中,可以通过点击按钮的效果来理解信号和槽:点击按钮就是信号,而槽则是按钮被点击后发生的事情,如显示标签并更新按钮文本。
在之前章节解释并应用过回调(callback)函数。抛开实现细节,回调通常指的是一个通知函数(notification function),通过传递一个函数指针来响应程序中的事件。这种方式与信号和槽相似,但信号和槽更易于理解,较为直观。所有继承自QObject
或其子类(如QWidget
)的类,都可以包含信号和槽。信号由对象发出,当对象的状态发生变化并且这种变化可能对其它对象有用时,信号就会被触发。发出信号的对象并不会关心是否有其它对象接收到信号,这体现了信息的封装,确保对象能够作为独立的软件组件使用。槽用于接收信号,但它们也只是普通的成员函数。正如发出信号的对象不关心是否有其他对象接收该信号,槽也不关心是否有信号连接到它。这保证了 Qt 中能够创建完全独立的组件。多个信号可以连接到同一个槽,一个信号也可以连接到多个槽。甚至可以将一个信号直接连接到另一个信号,这样,每当一个信号发射时,第二个信号也会立即发射。Qt 中的控件(部件)有许多预定义的信号和槽,例如QAbstractButton
(Qt 中按钮的基类)有一个clicked()
信号;而QLineEdit
(单行输入框)有一个名为clear()
的槽。因此,使用QToolButton
放置在QLineEdit
右侧,并将其clicked()
信号连接到clear()
槽,就可以实现一个带有清除文本功能的输入框如图11-3。这是通过信号的connect()
方法实现,代码如下:
图 11-3 带有清除文本功能的输入框
文件 | widget.py |
---|---|
代码 |
|
🤖 代码解读 |
这段代码实现了一个包含文本输入框(
|
11.4.2.1 自定义信号
在 Pyside6 中,自定义信号允许在类之间进行通信,尤其是在基于事件驱动的 GUI 应用程序中。信号是一种“通知”机制,当某些事情发生时,可以发出一个信号(signal),然后通过“槽”(slot)来响应这个信号。
- 信号(Signal):由对象发出,表示某些事件或状态的变化。信号没有任何逻辑,只是表示事件的发生。
- 槽(Slot):是一个函数或方法,当信号发出时,槽会被调用。槽可以执行任何操作,如更新界面、处理数据等。
Pyside6 中,信号和槽使用Signal
和Slot
来实现。Signal
用来定义信号;Slot
用来装饰定义接收信号的函数。自定义信号通常在继承自QObject
或其它子类的类中定义。信号的定义通过Signal()
来完成,信号可以接收不同类型的参数。
信号类型
Signal
是用于定义信号的类,支持传递各种类型的数据,常见的信号类型包括基本数据类型,如int
(整数)、float
(浮点)、str
(字符串)和bool
(布尔)等;及 Qt 类型,如QDate
(日期)、QTime
(事件)、QDateTime
(日期和时间)、QPoint
(二维坐标 (x,y))、QSize
(大小,如宽度和高度)、QRect
(矩形 (x,y,width,height))、QVariant
(可以存储任何类型的数据)等。
Signal
可以接受多个不同类型的参数,如complex_signal = Signal(int, str, float)
。如果信号不需要任何参数,则可以定义一个不带任何参数的信号,如simple_signal = Signal()
。
下述程序展示了如何使用信号和槽机制在 PySide6 中进行自定义信号传递。用户可以通过下拉框选择不同类型的信号(如字符串str
、列表list
、字典dict
、日期Qdate
等),点击按钮,信号被发送,并且通过槽函数处理并显示相应的结果。
图 11-4 自定义信号
文件 | widget.py |
---|---|
代码 |
|
🤖 代码解读 |
点击按钮时触发槽函数
该槽函数的作用是根据用户在下拉框中的选择,发射不同类型的信号。如果选择了
槽函数
这个槽函数根据接收到的参数类型,决定如何显示信息到标签( |
发送自定义数据
如果有自定义类型的数据对象,也可以将其作为信号的参数,但需要遵循 Qt 的对象模型(通常继承自QObject
),确保自定义类型可以被正确的传递和接收。
下述代码演示了如何使用 PySide6 信号和槽机制传递自定义数据类型。
图 11-5 发送自定义数据
文件 | widget.py |
---|---|
代码 |
|
🤖 代码解读 |
|
重载不同类型的信号和槽
下述代码展示了 PySide6 信号的重载(overloading)功能,即同一信号可以支持不同的数据类型。
图 11-6 重载不同类型的信号和槽
文件 | widget.py |
---|---|
代码 |
|
🤖 代码解读 |
该部分代码主要包括信号重载、信号与槽的应用和按钮点击控制逻辑几个内容。信号重载是 |
11.4.2.2 拦截信号,发送额外参数
信号连接到槽,槽在信号每次触发时都会运行。信号除了触发槽,许多信号还会传输数据,提供有关状态变化或触发槽的控件信息。接收槽可以使用这些数据对相同的信号执行不同的操作。但是除了自定义信号,默认的信号只能发射 PySide6 内置设计的数据,例如 QPushButton
的点击信号clicked
,在按钮被点击时触发,并发送checked
状态数据。槽接收到这个数据,但并不知道是哪个控件发射的信号或者希望接收一些别的有用的信息。因此希望信号能够添加额外的数据,发送到槽,并且槽能够接收,这就需要拦截信号。拦截信号并发送额外参数的方式可以通过中间拦截槽(interceptor slot),或者在connect()
方法中使用lambda
传递额外参数。
下述示例设计了两个按钮,通过信号和槽机制,利用拦截信号发送额外信息至同一个槽,槽根据接收到的额外信息判断是哪个按钮发射的信号。
图 11-7 拦截信号,发送额外参数
文件 | widget.py |
---|---|
代码 |
|
🤖 代码解读 |
|
发送多个数据
这个示例展示了如何使用信号和槽机制传递多个参数,包括按钮的文本信息、随机数组(使用 NumPy 库)和一个QLabel
控件label
。
在 Qt Creator 中的 Python 默认环境下需要安装 NumPy 库。在 Qt Creator 底部选择 Terminal 项,用 cd 定位到 Python 默认环境路径,如 cd C:\Users\richie\Omen_RichieBao\omen_APP\PySide6_cases\envs\env-venv,执行 Scripts\activate 激活虚拟环境,通过 pip install numpy 安装 NumPy 库
图 11-8 信号发送多个数据到槽
文件 | widget.py |
---|---|
代码 |
|
🤖 代码解读 |
|
11.5 菜单、工具栏和动作,及资源集合
图11-9中的示例应用开发了一个简单的文本编辑器,界面和功能类似于记事本,具备菜单栏、工具栏和状态栏,支持基本的文件操作和编辑功能。主窗口界面包括文件编辑区域,用户可以在其中输入和编辑文本。窗口标题显示了当前打开的文件名(如MTSbar.txt
),*
号表示文件已修改但未保存;菜单栏(Menu Bar)包含有File
(文件)(并包含New
新建、Open
打开、save
保存、Save As...
另存为和Exit
退出等功能),Edit
(编辑)(并包含Cut
剪切、Copy
复制、Paste
粘贴等基本文本编辑功能)和Help
(帮助)(并包含About
显示关于应用程序的信息,About Qt
显示 Qt 相关信息)等菜单;工具栏(Toolbar)具备文件操作和编辑相关的快捷按钮;状态栏(Status Bar
)显示应用状态,如当前操作的提示信息。弹出对话框包括点击About
和About Qt
弹出对应的弹出对话框,及文件修改警告弹出对话框,提供Save
(保存)、Discard
(放弃更新)和Cancel
(取消)三种选项。
图 11-9 文本编辑器(菜单栏、工具栏、状态栏)
使用 Qt Creator 创建一个项目,但是在Define Class
步骤,Base class
下选择 QMainWindow
。项目中使用了 QRC 资源文件(application.qrc
)管理 UI 相关的图片资源,并由pyside6-rcc
工具,在Terminal
终端中执行pyside6-rcc application.qrc -o application_rc.py
,将application.qrc
资源文件编译为application_rc.py
代码,使 PySide6 能够直接访问其中的资源(需要先用import rc_application
导入该文件),如icon = QIcon(QPixmap(":resources/images/new.png"))
。
图 11-10 应用的文件结构
建立 .qrc
文件,是从Projects
文件结构中项目(如本例为mainWindow
)上右键弹出菜单中选择Add New...
,选择弹出对话框中的Choose a template->Qt->Qt Resource File
建立.qrc
文件 | mainwindow.py |
---|---|
代码 |
|
🤖 代码解读 |
创建操作/动作(Action)
创建菜单栏
创建状态栏
创建状态栏 1.
该方法用于检查当前文档是否已经被修改,如果修改了,就弹出一个对话框询问用户是否保存更改。
该方法用于设置当前正在编辑的文件路径,并更新窗口标题和文档状态。
|
11.6 QML、QtQuick + PySide6
QML(Qt Modeling Language)是一个用于构建图形用户界面(GUI)和应用程序行为的声明式语言(declarative language),主要与 QtQuick 一起使用,由 Qt 框架提供,适用于快速开发现代、动态、富交互(如触摸、点击、互动等多种交互方式)的用户界面,广泛用于桌面、移动设备和嵌入式系统的开发。QML允许开发者以声明的方式描述界面的结构和行为。与传统的命令式编程(如 C++ 和 Python)不同,QML 更加关注“做什么”(声明),而不是“怎么做”(过程和逻辑)。使用 QML,开发者可以轻松构建复杂的界面和交互,支持动态界面,允许在运行时,根据条件或用户输入调整界面元素。QML 与 JavaScript 紧密集成,可以在 QML 中嵌入 JavaScript 来处理逻辑、事件、动画等交互行为。通过 JavaScript, 开发者可以动态控制界面的元素和行为。这种集成,使得 QML 在描述 UI 的同时,也能处理一些复杂的逻辑或事件管理。QML 应用程序可可以跨多个平台运行,包括 Windows、Linux、maxOS、Android 和 iOS 等。开发者只需要编写一次 QML 代码,即可以在不同平台上运行。QML 的设计考虑到了性能优化,尤其适合于需要流畅动画和高响应的应用程序。
QtQuick 是 Qt 的一个模块,提供了一种高效的方式来创建流畅、动态的用户界面,是基于 QML 声明式语言,旨在简化复杂用户界面的开发,包含了用于布局、动画、控件、图形和多媒体的工具。QML 与 Python 紧密结合,用 QML 来设计界面,用 Python 来处理后端逻辑。用QGuiApplication
来初始化应用,通过QQmlApplicationEngine
加载和显示 QML 文件,并用 Python 来控制 QML 中的组件和行为。
11.6.1 Hello World!(QML)
在 Qt Creator 中,新建一个项目(Create Project
)时,选择Choose a template->Application(Qt for Python)->Qt Quick Application - Empty
创建一个 Qt Quick 应用程序(名为 HelloWorld),其中包含一个空窗口。项目的文件包括HelloWorld.pyproject
,用于保存项目配置;main.py
,负责加载和运行 QML 界面,并处理应用逻辑和与 QML 的交互;main.qml
,用于描述用户界面的布局和交互。
示例代码创建了一个窗口,窗口中央有一个标签和一个按钮,初始时,标签显示"Click the button!"
,按钮上写着"Click Me"
。当点击按钮,标签上的文本会改变为"Hello World!"
。
图 11-11 应用 QML 的 Hello World 示例
文件 | main.qml | main.py | HelloWorld.pyproject |
---|---|---|---|
代码 |
|
|
|
🤖 代码解读 |
|
|
列出了构建应用所需的文件,
|
11.6.2 QML 的基本语法
基本语法 | GUI | .qml | .py | 说明 |
---|---|---|---|---|
定义对象的层次结构 |
|
main.qml |
main.py |
main.qml 这个 QML 代码展示了一个简单的层次结构,其中包括一个 QML 元素是嵌套的,父元素包含子元素。每个子元素会继承其父元素的一些特性(如大小和位置),并可以进一步定义。QML 的层次结构适合于构建负责且灵活的 UI,同时保持代码简洁和易于理解。
|
使用控件(Controls)创建 QML 应用程序[菜单栏+工具栏+状态栏] |
|
main.qml |
main.py |
main.qml
该段代码显示了如何在 Qt Quick 中使用
main.py
|
处理用户输入 |
|
main.qml |
main.py |
main.qml 这段代码展示了如何处理用户输入、包括鼠标点击、键盘事件、触摸事件和文本输入。
键盘事件处理(
MouseArea事件
TextField 输入处理
|
属性绑定 |
|
main.qml |
main.py |
main.qml 这个示例的 QML 代码展示了属性绑定(Property Bindings)的使用,主要包括矩形之间的绑定,滑块与界面互动和实时文本更新等。
|
动画 |
|
main.qml |
main.py |
main.qml 这段 QML 代码展示了多个动画效果,结合了
|
定义可重用的自定义 QML 类型 |
|
MessageLabel.qml CustomButton.qml main.qml |
main.py |
MessageLabel.qml 这段代码使用Qt Quick(QML)构建了一个简单的用户界面组件,主要用于展示不同类型的消息。代码定义了一个
创建的一个带有动态文本和动画效果的 UI 组件,根据 CustomButton.qml 该部分自定义了一个按钮组件,通过
main.qml 该部分 QML 代码使用了
QML 中重要的概念之一是类型重用。一个应用程序可能有多个相似的可视化类型(如多个按钮),QML 允许将这些类型定义为可重用的自定义类型,以最小化代码重复并最大化可读性。 |
11.6.3 Python-QML 集成
QML 是一种声明式语言,相较传统编程语言(如 C++) 可以更快的用于设计 UI (用户界面)。QtQml 和 QtQuick 模块为基于 QML 的 UIs 设计提供了基础设施。下述示例解释了 Python 与 QML 的集成,使用 Python 作为后端逻辑代码,处理来自前端 QML 接口中 UI 元素的信号。定义了多个槽函数,提供了颜色、字体样式和大小等属性的设置。文件结构如图。
图 11-12 Python-QML 集成界面
图 11-13 Python-QML 集成文件结构
文件 | main.qml | main.py | qtquickcontrols2.conf | HelloWorld.pyproject |
---|---|---|---|---|
代码 |
|
|
|
|
🤖 代码解读 |
这段 QML 代码实现了一个交互式界面,允许用户通过选择不同的单选按钮来改变标签文本的样式(斜体、粗体、下划线或无样式),通过按钮选择颜色,并用滑动条调整字体大小。所有这些操作都通过
|
这段 PySide6 应用程序,使用 Qt 的 QML 引擎加载一个 QML 文件,并通过 Python 中的
此代码是 PySide6 中一个常见模式,用于将 Python 和 QML 无缝集成,以便在 QML 中动态调用 Python 函数。
|
该配置文件为应用设置了界面风格、主题和强调色。 |
11.7 模型视图
模型视图(Model-View)架构是一种常用于图形用户界面(GUI)应用程序设计的设计模式,帮助分离用户界面的显示(视图)与数据的管理(模型)。这种模式使得程序的结构清晰、可维护、且使得数据和显示逻辑的修改可以互不影响。模型是应用程序的数据结构和业务逻辑的核心,负责存储和管理数据,并提供接口来访问和修改这些数据。模型不关心数据如何被显示,只关心数据的管理和操作。视图负责将数据以可视化的形式展示出来,显示模型中的数据并允许用户与其交互。视图不直接处理数据,只关注如何呈现数据。
11.7.1 [Q]ListView
[Q]ListView
和ListView
都是 Qt 框架中的视图控件,用于显示列表数据,都是基于 Model-View(模型视图)架构,但分属于不同的 UI 构建方式:QListView
属于基于QWidgets
的传统桌面应用,而ListView
属于 QML/QtQuick 框架。QListView
用于显示从模型中获取的数据列表,通常与QAbstractListModel
或类似的模型结合使用,在传统的桌面应用程序(基于 QWidgets
)中用于显示垂直或水平的项列表。ListView
是 QtQuick/QML 框架中的一个控件,用于显示从模型中获取的数据,通常与ListModel
或其它自定义模型配合使用。
该示例程序实现了一个简单的待办事项应用,具有添加、删除,标记完成等功能。
方式选择 | Qt Designer + PySide6 | QML(QtQuick) + PySide6 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
界面 |
|
|
||||||||||||||||||||||||
[Q]ListView |
|
QML(QtQuick)中,
当数据量较大时,或者需要与 Python 后端交互,QML 中的 |
||||||||||||||||||||||||
代码 |
在 Qt Creator 下的 Qt Designer (
|
|
||||||||||||||||||||||||
🤖 代码解读 |
该示例使用了 Qt 的模型视图架构,通过
|
前端(QML):使用 QML 定义应用的用户界面,包括展示待办事项的列表、列表项的交互效果;及界面底部区域提供输入框和按钮,通过按钮调用模型提供的槽函数,实现添加、删除、和完成任务的操作。 后端(PySide6):定义数据结构 这种设计将数据逻辑和界面展示分离,通过 QML 的数据绑定和 PySide6 的模型-视图架构,实现了一个功能简洁而功能齐全的待办事项应用。
|
11.7.2 [Q]TabelView
QTableView
(PySide6/Python)和TableView
(QtQuick/QML)是 Qt 框架中两种不同的表格视图组件,分别适用于桌面应用程序(基于 QtWidgets
)和 QML/QtQuick 应用程序(基于声明式语言构建 UI )。两者均用来显示和操作表格数据,但在使用方式、设计模式和实现上存在差异。
QTableView
是 Qt 的一部分,用于在桌面应用中显示表格数据,依赖于 Qt 的 Model-View(模型视图) 架构,其中QTableView
是 View, 用于显示数据,而 Model (如QAbstractTableModel
)则负责提供数据。QTableView
主要用于传统的桌面应用程序,采用基于QWidget
的 UI。
TableView
是 QtQuick 模块中的一个组件,专门用于 QML 应用程序,其同样遵循 Model-View架构,表格数据通过模型提供,而 QML 中的TableView
控件用于显示数据。QML 是声明式语言,因此可以通过 QML 定义 UI 元素。
方式选择 | Qt Designer + PySide6 | QtQuick/QML + PySide6 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
界面 |
|
|
|||||||||||||||
[Q]TableView |
|
|
|||||||||||||||
代码 |
|
|
|||||||||||||||
🤖 代码解读 |
通过
|
该部分代码展示了如何在 QML 中使用 代码的核心点如表,
main.qml 这段 QML 代码展示了如何使用
main.py 该部分代码展示了通过 QtQuick/QML 和 PySide6/Python 结合来使用
|
11.8 SQL 数据库
PySide6.QtSql
模块提供了对 SQL 数据库的访问接口,允许在 PySide6 应用程序中管理和操作数据库。该模块基于 Qt 的 QtSQL 框架,提供了一套面向对象的数据库连接、查询执行及结果管理 API,支持 SQLite、MySQL、PostgreSQL 和 ODBC 等数据库。常用组件中QSqlDatabase
类用于管理数据库连接,支持不同数据库驱动,如QSQLITE
(SQLite)、QMYSQL
(MySQL)、QPSQL
(PostgreSQL)和QODBC
)(ODBC (includes Microsoft SQL Server)等。并允许创建多个数据库连接。QSqlQuery
类用于执行 SQL 语句(如SELECT
、INSERT
、UPDATE
和DELETE
等)。支持参数绑定,提供查询效率并防止 SQL 注入。QSqlTableModel
允许将数据库数据直接绑定到 pySide6 的 UI 组件(如QTableView
),方便在 GUI 中显示和编辑数据。
示例应用程序图11-13使用 PySide6 结合 SQLite 作为数据库,构建了一个图形化界面(GUI)来管理数据库。示例中所用数据库为chinook-database,是一个可用于 SQLserver、Oracle、MySQL等的示例数据库,适合于演示和测试针对单个和多个数据库服务的 ORM(Object-Relational Mapping) 工具。示例应用程序提供了数据查询、删选、编辑和 CRUD(create、read、update 和 delete) 操作,且通过QSqlRelationalTableModel
关联多个表,实现外键映射。
图 11-13 用 Qt 模型查询 SQLite 数据库
为了方便和加快用户界面的设计开发,直接使用 Qt Designer 进行控件布局,如图11-14。从Object Inspector
(对象观察器)可以查看所用到的控件及布局的层级关系。
图 11-14 项目 Qt Designer(Qt Creator) 用户界面布局
mainwindow.py
🤖 代码解读
- 数据库初始化(
init_db()
):连接 SQLite 数据库(Chinook_Sqlite.sqlite
)。使用QSqlDatabase
设置数据库驱动(QSQLITE
)并打开数据库,返回QSqlDatabase
实例。db.setDatabaseName(db_path)
绑定数据库文件。db.open()
尝试打开数据库,返回True
表示打开成功,否则为False
。db.lastError().text()
可以获取具体的数据库错误信息。通过引发RuntimeError
异常,查看错误信息。 - 数据模型(
setup_model()
):这里构建了三个数据模型,model_top
、model_bottom
和model_mapper
,第一个使用了QSqlRelationalTableModel
方法,后两个使用了QSqlTableModel
方法,分别用于操作数据库不同功能的演示。 QSqlRelationalTableModel
允许使用外键关联其它表的数据。这里setTable("Track")
指定Track
表作为数据源。setEditStrategy(QSqlTableModel.OnFieldChange)
用于设置编辑策略,OnFieldChange
表示字段发生变更时,数据立即更新数据库。- 对于
model_top
数据模型,演示了删除不需要的列remove_columns()
;设置排序set_sort()
(默认为Milliseconds
降序排序);添加外键关联relational_table_add_columns()
,让Track
表可以显示Album
、MediaType
和Genre
等表中的数据;edit_related_fields()
配置 UI 代理,让QTableView
处理外键字段的编辑;更新列名update_column_names()
,使表头显示更友好的名称,如GenreId → Genre Name
等;搜索功能setup_search()
和filter_table()
,输入框监听(lineEdit_search.textChanged
),根据输入内容动态筛选Track
数据。self.model_top.select()
用于刷新数据,加载选择的Track
表内容。 - 表格 UI 绑定:
model_top
和model_bottom
数据模型通过setModel
方法分别将其绑定到各自的视图QTableView
上,显示数据库中表(Track
)的数据。主表tableView_top
绑定到model_to
;搜索结果表tableView_bottom
绑定到model_bottom
,用于展示搜索结果。self.ui.tableView_top.setColumnHidden(0, True)
隐藏了第一列。self.ui.tableView_top.setSortingEnabled(True)
开启排序,即点击表头可排序。 6.复杂查询:model_bottom
模型演示了自定义 SQL 查询,因为不涉及外键关联,使用了QSqlTableModel
方法。用QSqlQuery
进行高级 SQL 查询,查询Track
、Album
关联表,获取Track.Name
、Track.Composer
和Album.Title
。并使用LOWER()
进行不区分大小写的模糊搜索。绑定参数:track_name
、:track_composer
和:album_title
以支持动态查询。用搜索框(文本框)绑定事件,当文本框内容发生改变时,自动调用update_query()
执行搜索。 self.tableView_stretch()
是让tableView_top
和tableView_bottom
自适应宽度。- 数据编辑(CRUD):对于数据模型
model_mapper
,演示CRUD()
处理单条数据映射编辑。通过QDataWidgetMapper
绑定Track
表字段到 UI 控件,包括TrackId → spinBox_trackid
、Track Name → lineEdit_trackname
、Composer → lineEdit_composer_mapper
、Milliseconds → spinBox_milliseconds
、Bytes → spinBox_bytes
和Unit Price → doubleSpinBox_unitprice
。并提供数据浏览与保存功能。pushButton_previous
为上一条、pushButton_next
为下一条和pushButton_Savechanges
为提交修改。
11.9 图表
Python 编程语言的一大优势是用于数据科学领域,其具有丰富的数据分析统计工具,如数据结构库 NumPy、Pandas等,科学计算库 Scipy、SymPy 等,统计推断库 Statsmodels等,机器学习库 Scikit-learn 等,深度学习库 PyTorch 等,在数据可视化上有 MatplotlibPlotly、seaborn、bokeh、VTK、gradio 等。使用 PySide6 构建 GUI 应用程序时,可以从应用程序中访问所有这些 Python 库,从而实现复杂数据驱动应用程序和交互式仪表盘的构建。
图11-15展示的示例分别使用PyQtGraph和Matplotlib打印一天中24小时的温度变化曲线(数据为模拟生成)。PyQtGraph 是基于 PyQt/PySide 和 NumPy 构建的纯 Python 图形和 GUI 库,旨在用于数学/科学/工程应用。尽管 PyQtGraph 完全由 Python 编写,但由于大量利用 Numpy 进行数值运算和 Qt 的 GraphicsView 框架进行快速显示,因此具有较好的计算效率, 为 Qt 应用程序的高性能绘图库,并支持实时数据绘制。Matplotlib 是一个用于在 Python 中创建静态、动画和交互式可视化的综合库。
图 11-15 分别用 PyQtGraph 和 Matplotlib 库打印一天温度变化曲线
🤖 代码解读
该代码使用 PySide6 实现了一个 GUI 界面,并结合 PyQtGraph 和 Matplotlib 绘制并对比了两种不同的数据可视化方式。程序模拟了一天 24 小时的温度变化,并以折线图形式显示在 GUI 界面上。同一生成的数据,左图由 PyQtGraph 绘制,其交互性强,绘制速度快,适用于实时数据;右图由 Matplotlib 绘制,适合高质量出版级图表,有丰富的自定义选项。
该程序主要包括定义MplCanvas
类,封装 Matplotlib 画布, 和MainWindow
类。MainWindow
类中定义了用于生成 24 小时温度数据的generate_sites_temps()
方法;chart_with_pyqtgraph()
和plot()
是使用 PyQtGraph 绘制折线图;chart_with_matplotlib()
是使用 Matplotlib 绘制折线图。
- 生成 24 小时温度数据:
site1_temps
和site2_temps
是通过正弦函数(np.sin()
)模拟温度变化,并加入随机扰动(np.random.normal()
)。生成的DataFrame
存储两站点的温度数据。 - PyQtGraph 绘图:
setBackground("w")
设置背景颜色为白色;setTitle()
设定标题,蓝色,字号24pt
;setLabel()
设置坐标轴标签,红色,字号20px
;showGrid(x=True, y=True)
显示网格;addLegend()
添加标签;setXRange(0, 24)
使 X 轴覆盖0-24小时;setYRange()
让 Y 轴适应数据范围;mkPen(color=color)
创建绘图的画笔颜色;symbol="+"
使用+
作为数据点标记,symbolSize=30
控制大小。 - Matplotlib 绘图:用
MplCanvas(self, width=5, height=5, dpi=100)
创建FigureCanvas
画布;NavigationToolbar2QT(sc, self)
添加 Matplotlib 的工具栏(含有放大、缩小和拖动等工具);sc.axes.plot()
绘制折线;set_title("Plotting with Matplotlib", fontsize=20)
设置标题;grid(True
显示网格;legend()
显示图例;set_xlabel()
和set_ylabel()
设定坐标轴标签。
PyQtGraph 和 Matplotlib 绘图性能对比如表,
表:PyQtGraph 和 Matplotlib 绘图性能对比
特性 | PyQtGraph | Matplotlib |
---|---|---|
绘制速度 | 快,适合实时数据 | 慢,适合静态数据 |
交互性 | 高,可放缩拖拽 | 需要 NavigationToolbar2QT |
美观度 | 适用于数据监控 | 适用于高质量出版 |
自定义能力 | 较弱 | 丰富 |
代码复杂度 | 低 | 高 |
11.10 打包和发布应用
PySide6 部署(deploy)/打包应用程序的过程通常涉及将 Python 脚本、QML 文件、资源文件和必要的依赖项打包成一个可以执行文件(.exe
,.app
或Linux ELF
),以便可以在没有 Python 环境的计算机上运行。用于部署的工具有pyside6-deploy、fbs 、PyInstaller 、cx_Freeze 、py2exe 、py2app 、briefcase等,表展示了这些部署/打包工具的平台支持,
表 部署工具平台支持(引自 Deployment(Qt for Python),https://doc.qt.io/qtforpython-6/deployment/index.html)
Name(部署工具) | License(许可) | Qt 6 | Qt 5 | Linux | macOS | Windows |
---|---|---|---|---|---|---|
fbs | GPL | yes | yes | yes | yes | |
PyInstaller | GPL | partial | yes | yes | yes | yes |
cx_Freeze | MIT | yes | yes | yes | yes | yes |
py2exe | MIT | partial | partial | no | no | yes |
py2app | MIT | yes | yes | no | yes | no |
briefcase | BSD3 | partial | yes | yes | yes | yes |
Nuitka | MIT | yes | yes | yes | yes | yes |
上述部署工具是将 Python 打包成可执行文件(.exe
),但是要创建 Windows 安装程序(Installer),则还需要使用如 InstallForge工具创建完成。即如 PyInstaller 等部署工具是将.py
文件作为输入,输出为独立可执行文件.exe
;而 InstallForge 是将部署后的.exe
可执行文件作为输入,输出为安装程序(.exe
)。
- 部署/打包
- 实验中使用了 PyInstaller 工具进行部署。在项目所在的 Python 环境下执行
pip install pyinstaller
(终端命令行下)安装工具。 - 试验以 11.7.1 [Q]ListView 中的待办事项应用/ToDo(基于 Qt Designer + PySide6)为例。执行
pyinstaller --name ToDo --windowed --onefile --noconfirm mainwindow.py
命令完成打包。参数--onefile
为打包成单个.exe
文件;--windowed
为不显示终端窗口(适用于 GUI 应用);--name ToDo
为生成可执行文件名为ToDo.exe
。如果需要包含资源文件,如项目中的 data 数据文件夹,则可以增加参数--add-data "data;data"
。如果需要调试模式,增加参数--debug=all
,可以获取调试信息,有 Python 运行时错误、依赖加载和 Qt 相关问题等。如果在生成的dist
目录下,执行生成的.exe
可执行文件出错,可以尝试增加参数--collect-all PySide6
,包含Qt6
运行库。更多参数可以查看 PyInstaller 手册。 - 完成部署后,将在项目文件夹下生成
build
(PyInstaller 临时文件)和dist
(PyInstaller 生成的最终可执行文件)两个文件夹,及ToDo.spec
配置文件。当需要修改配置,可以在.spec
中直接调整,并执行pyinstaller ToDo.spec
完成部署,而无需重新执行第2步骤。而如何执行第2步骤时不能正常运行,则可以先生成.spec
文件,执行pyinstaller --name ToDo --windowed --onefile --noconfirm mainwindow.py
命令。自动生成的.spec
文件由于参数不同会有差异,如是否包含--onefile
参数,如果不包含,则增加有coll = COLLECT()
部分。
执行`pyinstaller --name ToDoWithOnefile --windowed --onefile --noconfirm --add-data "data;data" mainwindow.py` | 执行`pyinstaller --name ToDoWithoutOnefile --windowed --noconfirm --add-data "data;data" mainwindow.py` |
---|---|
|
|
- 创建安装程序(Windows)
下载 InstallForge 应用程序并安装。InstallForge 是一个 Windows 平台上的安装包创建工具,可以通过图形化界面配置安装程序。图11-16列出了其中主要三个配置界面。其中在Files
界面选择了使用参数--onefile
打包成一个单独的.exe
文件,因此不包含其它文件,如未使用--onefile
参数时,也需要在该页面增加dist->项目文件夹->_internal
,即_internal
文件夹(包含应用程序依赖的所有文件)。Build
界面中的Setup File
为输出的安装程序(.exe
),用于在 Windows 下安装。其它的配置说明可以从 InstallForge 官网文档中获取。
图 11-16 InstallForge 配置界面
试验的 ToDo 演示项目,未处理打包后数据本地磁盘保存问题,因此 ToDo 增加、删除、标记完成等工作尚不能保存。即关闭应用再打开后,将恢复到默认状态。
参考文献(Reference):
[1] Qt for Python, https://doc.qt.io/qtforpython-6/index.html.
[2] Martin Fitzpatrick, Create GUI Applications with Python & Qt6: The Hands-on Guide to Making Apps with Python (PySide6 Edition).Independently published.