• 【已解决】pyqt5的打包exe软件图标菜单栏/任务栏/小图标/窗口图标未显示


    pyqt5窗口设置图标遇到问题,最终就总结了这篇文章,解决自定义的窗口图标和文件管理器图标,以及任务栏图标的显示问题。

    1.起因:

    希望:pyqt5 项目,pyinstaller main.spec 打包,我想要 main.exe 就像一个普通的应用软件一样显示自定义的图标。在文件夹,运行后在任务栏都要显示图标。

    结果: main.exe 左侧图标还是老土的样子,并没有成为我的图标。独立运行是,任务栏也没有出现该图标。

    图标不显示,说到底是打包资源和路径的问题。
    在这里插入图片描述

    2.失败的尝试

    先说一下用过却失败的办法,给大家避坑。也可能有些人正碰上类似的问题,刚好能解决。

    1.失败1:有人说在代码最开头加上下面的代码,任务栏上就会出现自定义的图标。

    import ctypes
    
    if __name__ == "__main__":
        ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("myappid")
    
    • 1
    • 2
    • 3
    • 4

    在我这里用不用都无变化。

    2.失败2:有人说要在 QtDesigner 里面的时候就设置好,然后 pyuic5 -o xx.py xx.ui

    设置好确实可以在pycharm中调试运行时显示,但是依然没法在exe独立运行时在任务栏显示。

    3.失败3:我一直想,可能是资源文件没打包好,导致找不到图标才不行的。
    道理是对的,但是我一直折腾 pyrcc5 .\rcc.qrc -o rcc_rc.py 命令就没必要了。

    最终的路径错误是这样解决:


    3.解决:

    设置 exe 的图标:

    设置文件管理器中的图标。
    原图标:
    原始图标
    (随机图标,网络上随意找的图片,最好白背景,方便处理):
    图源网络

    实现后的图标:
    666
    要注意的是,windows上显示软件图标具有滞后性,所以当你把exe复制到桌面后发现图标没了,不要惊慌,一切尽在掌握!:
    在这里插入图片描述
    桌面图标看起来(滞后性,刷新没用,这是windows缓存机制的原因):
    图标又没啦
    如果你刚 pyinstaller 打包完成,想要立刻就看到图标变化怎么办?
    解决:在 cmd 中用如下命令刷新图标缓存(win10):

    ie4uinit.exe -show
    
    • 1

    在这里插入图片描述
    win7,8用:ie4uinit.exe -ClearIconCache

    下面是设置 exe 的图标的具体做法。

    做法:
    exe图标必须是 ico,所以要先制作图片。

    1.先将 png 转换为 ico 图片(这个地方只能是 ico 格式才能设置)。
    png转ico

    有很多在线转换网站,但都不太好用,这个还行。你如果有更好的,不妨在评论区留言。

    导出尺寸你可以先用 16*16 大小。
    windows 在文件管理器(就是文件夹)里默认用的是 16*16 的尺寸。(不过我后来截图发现,直接设置成256是最佳,windows会根据场景设置尺寸,mac不会)。

    2.在 main.spec 中设置 icon 路径(pyinstaller 的时候打包进去),我用的是 main.spec,所以设置:

    exe = EXE(
    ...
        icon='resource\\qrc\\image\\mian.ico',
    
    • 1
    • 2
    • 3

    如果用pyinstaller命令直接打包格式差不多如下:

    pyinstaller -i  "D:\xxx.ico" -F -D ×××.py
    
    • 1

    -i 就是 -icon 的意思


    设置任务栏图标(窗口图标,运行时图标)

    1.增加代码:假设你的图片路径为 image/my.png

         def init_ui(self):
            filename = self.resource_path(os.path.join("image/", "my.png"))
            self.setWindowIcon(QIcon(filename)) 
    
        def resource_path(self, relative_path):
            if getattr(sys, 'frozen', False):
                base_path = sys._MEIPASS
            else:
                base_path = "./"
            ret_path = os.path.join(base_path, relative_path)
            return ret_path
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注意: resource_path 函数的作用就是区分你在 pycharm 的测试环境,还是在 exe 的实际运行环境。 这个函数是重点,如果没有这个函数,你设置的图像依然不会正常显示。
    sys._MEIPASS 是获得 exe 在Windows上运行时的路径(并不是exe的路径,而是一个exe解压后的临时路径)。

    2.把图片一起打包过去,我用的是 pyinstaller main.spec 命令,只需要增加一个 data 就行了:

    datas=[
    (path.join('D:\\xxx', '.\\image\\'), '\\image\\'),
    ],
    
    • 1
    • 2
    • 3

    可以先把我的这段代码复制下来,在这基础上改,尽量不要手写。
    就这样,第一步,代码里设置窗口图标,第二步,打包图片到运行路径下,,这两步都完成就行了。逻辑上走通。

    看看运行效果:
    在这里插入图片描述
    软件运行时的图标问题都解决了,请为我打 666,谢谢您嘞!

  • 相关阅读:
    C#入门(10):集合用法介绍
    CTF-PWN-[ZJCTF 2019]Login 栈位置的转换跟踪
    【AWS SMB】关于AWS 中小型企业 (SMB) 能力介绍及注意事项
    C++--二叉搜索树初阶
    Sleuth链路追踪,Zipkin集成
    系统架构设计:19 论数据挖掘技术的应用
    从零开始学网站建设:从需求分析到上线发布
    奉加微蓝牙芯片PHY6222,支持mesh,SRAM、可选128K-8M
    LeetCode //C - 160. Intersection of Two Linked Lists
    SpringSecurity基础:SecurityContext对象
  • 原文地址:https://blog.csdn.net/JiuShu110/article/details/132715419