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

news2024/9/27 19:26:54

1.起因:

希望:pyqt5 项目,pyinstaller main.spec 打包,我想要 main.exe 就像一个普通的应用软件一样显示我自定义的图标。

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

最后,无意中发现有个简单的办法就能实现了。说到底是打包资源和路径的问题。
在这里插入图片描述

2.失败的尝试

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

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

import ctypes

if __name__ == "__main__":
    ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("myappid")

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

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

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

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

3.解决:

设置 exe 的图标:

原图标:
原始图标
(随机图标,网络上找的图片,最好白背景,方便处理):
图源网络

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

ie4uinit.exe -show

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

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

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

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

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

导出尺寸你可以先用 16*16 大小。
windows 在文件管理器(就是文件夹)里默认用的是 16*16 的尺寸。在桌面用的好像是64*64?,所以导出64的也行(我测试的时候用的16,桌面图标被放大了不好看)。

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

exe = EXE(
...
    icon='resource\\qrc\\image\\mian.ico',

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

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

-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

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

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

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

就这样,第一步,代码里设置窗口图标,第二步,打包图片到运行路径下,,这两步都完成就行了。逻辑上走通。

看看运行效果:
在这里插入图片描述
请为我打 666,谢谢您嘞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/985077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

API接口与电商平台之间的联系,采集京东平台数据按关键字搜索商品接口示例

关键字搜索商品的重要性: 1.引入精准流量 关键词第一个也是最重要的作用就是为我们宝贝引进精准的流量,这一作用无论是在自然搜索中还是直通车中都是一样的。 第一步关乎的是我们宝贝的展现,而第二步用户是否会点进我们的宝贝,…

爬虫爬取mp3文件例子

相信训练模型时数据集的获取也是一个很头疼的事情,搞cv领域的可以扛着摄像头架起三脚架拍摄获取(以前干过),但是如果是nlp领域的呢,特别是chatgpt等大模型出来后对这类文本等数据的需求更大,如果没有现成的…

攻防世界-WEB-Web_php_include

打开靶机 通过代码审计可以知道,存在文件包含漏洞,并且对伪协议php://进行了过滤。 发现根目录下存在phpinfo 观察phpinfo发现如下: 这两个都为on 所以我们就可以使用data://伪协议 payload如下: - ?pagedata://text/plain,…

测试可用的淘宝API(商品详情数据、买家信息、卖家信息、店铺信息、订单信息)

什么是API? API全称Application Programming Interface,即应用程序编程接口,是一些预先定义的函数,或指软件系统不同组成部分衔接的约定,用于传输数据和指令,使应用程序之间可以集成和共享数据资源。 简单来说&#…

SQL语言的分类:DDL(数据库、表的增、删、改)、DML(数据的增、删、改)

数据库管理系统(数据库软件)功能非常多,不仅仅是存储数据,还要包含:数据的管理、表的管理、库的管理、账户管理、权限管理等。 操作数据库的SQL语言,基于功能,划分为4类: 1、数据定…

64位Office API声明语句第110讲

【分享成果,随喜正能量】以大慈为所住,给一切众生快乐,观众生心与菩萨心平等平等。以大悲为住处,不轻末学,善根成熟了他会发心,将来也能成佛。舍有为而不执著无为,住无为而不舍有为,…

正方实践系统打卡

Use HTTP (已完成) 📜 使用指南 🛖 项目结构 log 日志文件 use 使用情况 (待) data.py 数据 log.py 日志 main.py 主函数 只需要修改data.py文件内容即可: header ——> 头文件 User-AgentCookieAccept user ——> 用户信息 ZFT…

Kafka3.0.0版本——消费者(消费者组详细消费流程图解及消费者重要参数)

目录 一、消费者组详细消费流程图解二、消费者的重要参数 一、消费者组详细消费流程图解 创建一个消费者网络连接客户端,主要用于与kafka集群进行交互,如下图所示: 调用sendFetches发送消费请求,如下图所示: (1)、Fet…

RabbitMQ: Routing结构

生产者 package com.qf.mq2302.routing;import com.qf.mq2302.utils.MQUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection;public class EmitLog {public static final String EXCHANGE_NAME"emitlogs";public static void main(…

基于Jmeter和Jenkins搭建性能测试框架

搭建这个性能测试框架是希望能够让每个人(开发人员、测试人员)都能快速的进行性能测试,而不需要关注性能测试环境搭建过程。因为,往往配置一个性能环境可能需要很长的时间。 1、性能测试流程 该性能测试框架工作的流程主要有&am…

【代码随想录】dfs和bfs (所有可能的路径、岛屿数量)

所有可能的路径&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution { public:vector<int> path;vector<vector<int>> result;void dfs(vector<vector<int>> graph, int x){//1 确认递归函数…

Java日志框架的扛把子 - SLF4J - SLF4J的原理和实践

1. Java世界中的日志框架 Java世界中的日志框架 其中&#xff0c;slf4j和jcl属于门面日志框架&#xff0c;而其它的几个则是真正干活的ddidic底层日志框架。冷知识&#xff1a;其中标红的日志框架&#xff0c;它们的作者是同一人。不同的日志框架&#xff0c;API接口往往也不一…

解锁前端Vue3宝藏级资料 第一章 带你深入了解Vue3项目创建 2 (使用 Webpack 5 搭建 vue项目)

在之前的文章中&#xff0c;我们已经了解了如何使用Vue CLI来创建Vue项目的开发环境。现在&#xff0c;大家已经可以轻松地运用Vue CLI来构建自己的Vue项目了。然而&#xff0c;你可能仍然对背后的工作原理感到困惑。接下来&#xff0c;我将引导你们在不使用Vue CLI的情况下&am…

Python超入门(1)__迅速上手操作掌握Python

# 1.第一个代码&#xff1a;输出语句 # 1.第一个代码&#xff1a;输出语句 print("My dogs name is Huppy!") print(o----) print( ||| ) print("*" * 10) """ 输出结果&#xff1a; My dogs name is Huppy! o----||| ********** "&…

私有化部署即时通讯平台,完美替代飞书和钉钉的SaaS系统

在当今快速发展的数字化时代&#xff0c;企业对于安全、灵活、可定制的即时通讯平台需求不断增长。作为一家领先的品牌&#xff0c;WorkPlus专注于提供私有化部署的即时通讯平台&#xff0c;完美替代飞书和钉钉的SaaS系统。本文将重点介绍WorkPlus如何通过创新的解决方案&#…

2023高教社杯数学建模B题思路分析 - 多波束测线问题

# 1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播&#xff0c; 在不同界面上产生反射&#xff0c; 利用这一原理&#xff0c;从测量船换能器垂直向海底发射声波信 号&#xff0c;并记录从声波发射到…

【MATLAB第72期】基于MATLAB的LightGbm(LGBM)梯度增强决策树多输入多输出回归预测模型

【MATLAB第72期】基于MATLAB的LightGbm(LGBM)梯度增强决策树多输入多输出回归预测模型 一、学习资料 (LGBM)是一种基于梯度增强决策树(GBDT)算法。 往期研究了多输入单输出回归预测方法&#xff0c;本次研究多输入多输出回归预测。 参考链接&#xff1a; lightgbm原理参考链…

高德地图API使用教程

高德地图API使用教程 开发前准备获取key值和相关安全密钥 简单使用需求开发h5范围打卡-vue3地图选点-vue3 开发前准备 获取key值和相关安全密钥 进入高德开放平台 https://lbs.amap.com/ 登录后&#xff0c;打开我的应用&#xff08;无账号要先注册&#xff09; 打开我的应用…

3dsmax 蒙皮替换骨架

需求 本文描述部分来源于 TAZORN&#xff0c;最后附上Python实现 保留蒙皮信息&#xff0c;将骨骼替换成新的骨架模型M上的Skin目前指定的是骨架A&#xff0c;在蒙皮信息不变的情况 下更换成骨架B 替换的操作需要用到 SkinUtilities 工具 手动进行骨骼替换的方法 Snapshot原…

maven打包时显示无效jdk版本

1、配置当前项目所需的Jdk版本 2、与当前项目指定的jdk版本相同 3、与当前项目指定的jdk版本相同 4、与当前项目指定的jdk版本相同 5、指定主项目启动时的vm配置与当前项目所需版本相同