我们通常在发布软件的时候,将编写好的程序打包成.exe程序,这样就可以在没有安装Python的环境中运行我们的软件,经常使用PyInstaller模块对源文件打包。

安装PyInstaller

输入以下命令安装pyinstaller:

pip install pyinstaller

验证是否安装成功,输入以下命令:

pyinstaller

在这里插入图片描述

一、单个.py文件打包

  1. 先写一个简单的PyQt5程序,保存为testDemo.py,内容如下:
#coding = 'utf-8'
 
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QTime
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.Init_UI()
    def Init_UI(self):
        self.resize(300,300)
        self.setWindowTitle('PyQt5')
        self.btn = QPushButton('点击我',self)
        self.btn.resize(100, 30)
        self.lable = QLabel('显示',self)
        self.lable.resize(100,30)
        self.btn.move(100, 50)
        self.lable.move(100, 100)
        self.btn.clicked.connect(self.clientShow)
 
        self.show()
    def clientShow(self):
        timeStr = QTime.currentTime().toString('HH:mm:ss')
        self.lable.setText(timeStr)
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    app.exit(app.exec_())
  1. 使用如下命令进行打包

pyinstaller -F -w testDemo.py

-F:表示打包一个单个文件,如果你的代码都写在一个.py文件的话,可以使用这个,如果是多个.py文件就别用。

-w:使用Windows系统执行,当程序启动的时候不会打开命令行(只对Windows有效)。

执行完毕命令之后,会在.py文件所在的目录下,生成如下文件和文件夹内容,我们可以在dist目录中找到已经编译好的.exe可执行文件,双击就可以执行。

在这里插入图片描述
在这里插入图片描述

  1. 给exe可执行文件添加图标

我们可以在testDemo.spec文件的最后一行,添加如下内容,指定图标的路径。
在这里插入图片描述

然后使用命令:

pyinstaller TestAdd.spec

就可以将生成exe软件的图标修改了。

也可以在打包的时候直接执行如下命令:

pyinstaller -F -w testDemo.py -i lol.ico -n testDemo

二、包含.ui文件的软件打包

一般我们编写的PyQt5软件都不会把所有的内容写在一个.py文件中的,看过我前几篇和PyQt5相关文章的朋友都知道,一般我们都会将界面ui和逻辑分开,将多个界面和功能的模块分开。

以我之前写的一个Demo程序为例,首先使用QtDesigner设计一个界面,生成xxx.ui文件,使用pyuic5命令生成对应的ui_xxx.py文件,然后编写控制文件Callxxx.py,最后编写启动文件main_xxx.py,这样就形成了多个文件的目录结构。
在这里插入图片描述

接下来我们就开始打包这个软件,使用如下命令:

pyinstaller -D -w main_xxx.py

-D:表示打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码。

打包之后目录内容如下:
在这里插入图片描述

三、包含QSS文件的软件打包

如果在PyQt5的项目工程中包含了QSS样式表,这里以我《3.在PyQt5中使用QSS进行UI美化》这篇文章的项目代码为例,项目执行效果如下图:
在这里插入图片描述
工程目录中还包含了.qrc资源文件,qss样式表目录和images图片资源目录,如下图:

在这里插入图片描述

这时候我们可以使用如下命令:

pyinstaller -D -w main_xxx.py

一切正常,开始打包我们的软件,也正常生成了dist目录,正常生成了运行目录,但是当我们点击生成的main_xxx.exe时,却报了如下图的错误:
在这里插入图片描述
原因是程序在调用QSS文件时使用了相对路径,运行的时候会去这个路径找对应的样式文件或者图片文件,main_xxx.py文件如下:

from PyQt5.QtWidgets import *
from mainwindow import MainWindow
import sys
import source_rc

class CommonHelper:
 def __init__(self):
 pass
 @staticmethod
 def readQss(style):
 with open(style, 'r') as f:
 return f.read()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    styleFile = './qss/style.qss'
 #换肤时进行全局修改,只需要修改不同的QSS文件即可
 style = CommonHelper.readQss(styleFile)
    mainWindow.setStyleSheet(style)
    mainWindow.show()
    sys.exit(app.exec_())

所以我将qss文件夹和images文件夹拷贝到生成的exe目录下,就可以正常运行了:

在这里插入图片描述

运行效果如下:
在这里插入图片描述
最后贴一张pyinstaller的参数图,大家可以参照查看。在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐