美文网首页
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相爱相杀的故事

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