项目环境
- Python 3.7
- PyQt5
- Windows 10
项目文件
untitled.ui
主窗口的 UI 文件. 由 Qt Creator 或 Qt Designer 生成. 用于窗体的设计. 下面截图是其设计界面.
我们现在要做的是
1. 按蓝色箭头部分, 创建 `untitled.qrc` 文件来存储 GUI 用到的资源文件, 然后添加一个 `icon.png` 资源到这个列表里.
2. 按红色箭头部分 >> Choose Resource >> 选择 刚刚添加进来的 `icon.png` 作为其按钮图标.
untitled.qrc
点击 Open Resource File
查看刚刚创建的 untitled.qrc
// untitled.rqc
<RCC>
<qresource>
<file>icon.png</file>
</qresource>
</RCC>
现在将其转换为 Python 文件 untitled_qrc.py
, 以便后面程序打包后继续使用这些资源.
$ pyrcc5 -o untitled_qrc.py untitled.qrc
mainwindow.py
untitled.ui
对应的 Python 文件.
关键点都在注释中标明
# mainwindow.py
import os
import sys
import untitled_qrc # This import all resources listed in the `untitiled.qrc` file.
from PyQt5.QtWidgets import QApplication, QDialog, QMainWindow
from PyQt5.uic import loadUi
def resource_path(relative_path):
if getattr(sys, 'frozen', False):
base_path = sys._MEIPASS # 此路径为我们把 untitled.py 打包为 untitled.exe 后, untitled.exe 所在路径. 也是 untitled.exe 运行时的根目录.
'''
Pyinstaller 打包 untitled.py 时, 我们会通过 .spec 配置文件指定在 untitled.exe 的所在路径下创建一个 DATA 文件夹.
我们会显式的将所有程序需要用到的资源文件在 .spec 文件里定义其 原路径 (就是文件打包前的路径) 和 目标路径 (就是这里的 DATA 文件夹).
.spec 会把这些文件都拷贝到 DATA 目录下.
随后我会提到如何生成 .spec 文件.
'''
base_path = os.path.join(base_path, 'DATA')
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
class MainWindow(QDialog):
def __init__(self):
super(MainWindow, self).__init__()
'''
下面一行代码输入了文件的相对路径: `untitled.ui`
通过 resource_path() 返回这个文件的打包后的绝对路径: `exe_file_path/DATA/untitled.ui
'''
ui_path = resource_path('untitled.ui')
loadUi(ui_path, self)
if __name__ == '__main__':
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
打包为 exe 文件
$ pyi-makespec untitled.py
创建.spec
文件
高亮的部分就是我们在生成的.spec
添加的资源
语法为
[(原文件路径, 打包后 exe 文件所在路径下要创建的文件夹名),
( ... ),
... ]
2. $ pyinstaller untitled.spec
来打包文件.
执行后生成 build
和 dist
.
build
是临时文件, 可不用管.
dist
里有打包好的文件, 可拷贝到别的计算机上用.