相信使用PyQt5的你是奔着Qt的界面设计去的,相比使用C++来编写,Python简洁的语言使你的开发如有神助,但是,编程一小时,打包花两天的问题困扰着不少使用者。
本文主要针对PyQt5的打包遇到的问题,附上常见问题网上的资源,希望能帮你快速查到你遇到问题对应的资源。
本文结构:
一、Python环境问题
二、打包失败报错
2.1 C盘缺少文件
2.2 报错"Failed to execute script"
2.3 打包成功,运行exe文件弹出控制台
三、程序打包exe图标相关问题
一、 Python环境问题
- 使用的环境为Windows平台,64位Python 3.6.4, PyQt5版本5.9.2, 暂未涉及到Linux及Mac, 查询版本是由于一方面Pyinstaller 3+版本对PyQt5 5.10的支持不好,建议使用Pyinstaller 3.4之后的版本。查询你所使用的PyQt5版本如下:
from PyQt5.QtCore import QT_VERSION_STR
from PyQt5.Qt import PYQT_VERSION_STR
from sip import SIP_VERSION_STR
print("Qt5 版本为: {}".format(QT_VERSION_STR))
print("PyQt5 版本为: {}".format(PYQT_VERSION_STR))
print("Sip 版本: {}".format(SIP_VERSION_STR))
参考博客:如何查询PyQt5版本
链接:https://www.xdbcb8.com/archives/1369.html
如果你使用PyCharm可以在File->Setting->Project:项目下的Project Interpreter中查看你的各个模块版本。
关于版本上的坑,参考博客:python3+pyqt5+pyinstaller的各种问题。
链接:https://blog.csdn.net/guanxiao1989/article/details/90417920
# pip安装指定PyQt5版本命令
pip install pyqt5==5.9.2 -i https://mirrors.aliyun.com/pypi/simple/
# 国内其他镜像
# 豆瓣:https://pypi.douban.com/simple/
# 清华:https://pypi.tuna.tsinghua.edu.cn/simple
# 中国科技大学 :https://pypi.mirrors.ustc.edu.cn/simple/
二、打包失败报错
- 常用Pyinstaller打包命令
pyinstaller [opts] [待打包程序.py]
opts常用选项为:
-F, –最终打包为一个exe文件
-D, –创建一个目录,包含exe文件及依赖文件(默认选项),会比较庞大
-c, 使用控制台,无界面(默认)
-w, 使用窗口,无控制台
参考博客:用PyInstaller打包PyQT5程序。
链接:https://blog.csdn.net/humanking7/java/article/details/80421898
建议在程序未成功打包前使用-F -c,在控制台运行exe文件,这样的好处是命令窗口会输出错误信息,便于定位问题,其次可以查看build/Project/warn-project.txt来查看错误信息
1)报错C盘缺少plugins
C:\*\*\_h_env\Library\plugins
参考博客《使用pyinstaller打包python文件为exe文件出现Cannot find existing PyQt5 plugin directories》
链接:https://blog.csdn.net/m0_37534550/article/details/86481785
需要将'\Anaconda\pkgs\pyqt-5.9.2-py36ha878b3d_0\Library\plugins\PyQt5'文件夹下的dll拷贝到该plugins路径,路径为Anaconda安装路径。
其次,你需要将'\Anaconda\Lib\site-packages\PyQt5\Qt\plugins'目录下的platforms文件夹也拷贝到plugins下,否则会报错This application failed to start because no Qt platform plugin could be initialized。
2)报错"Failed to execute script"
参考博客《pyinstaller failed to execute script》
链接:https://blog.csdn.net/a807296772/article/details/82769835
如果你是多个py文件,存放在不同路径下,请修改[待打包程序.py]同级目录下的.spec文件,其中Analysis的第一个列表包含你的所有py文件,如果和带打包的程序在同级目录,直接使用文件名即可,否则使用绝对路径,如['FileAssitantTest.py', 'D:\PythonCode\UI_Interface.py'],
至于详细配置,可参考博客《Pyinstaller 打包及Spec文件相关》
链接:https://blog.csdn.net/weixin_42052836/article/details/82315118
注意:你可以自行编辑.spec文件,编译完成后,使用Pyinstaller打包时需要使用下面的格式, 否则spec文件会被重新覆盖,对自己编辑的spec记得备个份。
pyinstaller [opts] [待打包程序.spec]
3)打包成功,运行exe文件弹出控制台
记得前面使用-F -c么,这个时候你可以编辑spec文件中的'console=False',正常情况就不会弹出控制台,除非程序调用了控制台。
三、 程序打包exe图标相关问题
对于我们打包程序时需要用到的图标,可分为两类:
- 文件列表显示的图标 文件列表中显示的图标
- 任务栏及程序左上角的图标 任务栏图标
针对第1类图标
需要使用ico格式文件,在编译时使用-i + 图标路径即可完成
pyinstaller -F -w -i E:\pythonFiles\PYQT5Tutorial\src\imgs\Home.ico project.py
问题可能出现在完成后在文件列表图标未正常显示,或者修改图标文件没有效果,重启看下,这边出现重启后才会生效,囧。
针对第2类图标
1)使用相对路径加载图标
self.icon_path = self.addIconPath()
icon = QIcon()
icon.addPixmap(QPixmap(self.icon_path), QIcon.Normal, QIcon.Off)
self.setWindowIcon(icon)
# 获取路标所在的路径
def addIconPath(self):
base_path = ''
if getattr(sys, 'frozen',False):
base_path = os.path.dirname(sys.executable)
elif __file__:
base_path = os.path.dirname('__file__')
return os.path.join(base_path, 'imgs\\qticon.png')
问题是打包后需要获取图标所在的路径,简单使用相对路径会导致加载路径错误而无法正常显示,需要获取可执行文件所在路径,进而转到图标路径。
参考资源:
pyinstaller 打包pyqt设置图标
链接:https://blog.csdn.net/wuyuxiuluo/article/details/102574010
2)使用qrc资源
使用qrc的步骤:
1.编写qrc文件
<RCC>
<qresource prefix="/">
<file alias="qticon.png">imgs/qticon.png</file>
</qresource>
</RCC>
2.将qrc使用Pyrcc转换为py文件
3.在程序中import转换后的py文件,
import icon_resoureces
# 设置程序的图标(第2类图标)
self.setWindowIcon(QIcon(":/qticon.png"))
设置后显示结果如下:
图标显示效果使用qrc会将相关资源文件转为2进制信息存储,相比使用路径加载图像资源更稳定,不会出现图像资源丢失而导致图表显示异常。关于设置第2类图标打包显示异常问题,也有可能是图片问题,第2类可以使用png格式,不妨换图片试试
3)图标问题参考资源
PyQt5 打包icon图标方法
链接:https://fishc.com.cn/thread-120391-1-1.html
资源文件 .qrc 的使用
链接:https://blog.csdn.net/gongjianbo1992/article/details/105361880/
网友评论