美文网首页
PyQt5与Pyinstaller相爱相杀的故事

PyQt5与Pyinstaller相爱相杀的故事

作者: CodeFUN | 来源:发表于2020-04-18 23:31 被阅读0次
相信使用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. 文件列表显示的图标 文件列表中显示的图标
  2. 任务栏及程序左上角的图标 任务栏图标
针对第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/

相关文章

  • PyQt5与Pyinstaller相爱相杀的故事

    相信使用PyQt5的你是奔着Qt的界面设计去的,相比使用C++来编写,Python简洁的语言使你的开发如有神助,但...

  • 相爱相杀之庄子与惠子

    最近的荧屏热播大剧,都有相爱相杀来比喻男女主角的情感纠葛!看罢庄子与惠子的小故事,感觉用相爱相杀,来形容两者的关系...

  • 相爱相杀,相爱相杀?

    相爱相杀 婚姻与爱情,这个话题古老而永恒,爱情多样,婚姻亦多样。多样性的呈现,一是在形式,二是在结果。 ...

  • 相爱相杀

    我们时常“相爱”偶尔“相杀” ”相爱”“相杀”好似清晨的粥,深夜的酒,知己与混蛋,二者好似阴阳两...

  • 故事

    故事 文/红叶 故事,从相遇开始,然后相知,相爱,最后在相杀中结束。

  • 我与保险相杀相爱的故事

    在我家大宝出生之前,我对于保险没有任何好感,对保险代理人的印象就是像牛皮糖一样,沾上了就不停地被骚扰,希望你能买上...

  • bingo

    相爱相杀

  • 2017-08-26

    相爱相杀

  • 序幕

    一场穿越的故事 一对相爱相杀的眷侣 ...

  • pyinstaller打包exe

    软硬件环境 Windows 10 PyQt5 Python3.4 pyinstaller 前言 前文PyQt5系列...

网友评论

      本文标题:PyQt5与Pyinstaller相爱相杀的故事

      本文链接:https://www.haomeiwen.com/subject/wiiovhtx.html