pyinstaller 打包可执行程序,界面左上角图标丢失

使用PyQt5开发了一个GUI小程序,并使用pyinstaller打包成了一个可执行程序。但程序运行之后发现界面左上角的图标丢失…打包前明明是正常的哇/(ㄒoㄒ)/~~

验证过程

table.png和当前py文件处于同一个目录,使用的相对路径

self.setWindowIcon(QtGui.QIcon("table.png"))

此时运行程序,打开界面后左上角图标正常显示。开始使用pyinstaller打包,执行如下命令

pyinstaller -F -w -i table.ico TDTool.py

在dist目录下生成了TDTool.exe文件,并且程序图标显示正常,双击exe运行,打开程序界面后,左上角图标丢失,凉凉~

怎么办,将相对路径改成绝对路径试试

self.setWindowIcon(QtGui.QIcon("D:/PythonProjects/TDTool/table.png"))

再次打包验证,左上角图标正常O(∩_∩)O

我以为发现了真理,直到我把本地的图标文件删了~
删除或改名文件"D:/PythonProjects/TDTool/table.png"后再运行exe程序,
图标文件丢失!!!

我再次验证了使用相对路径的那个方案,然后把"table.png"放到exe所在的目录,再次运行,图标文件可正常显示~

综上,这种打包方式,并没有将左上角的图标文件和exe打包到一起,与使用相对路径绝对路径没有关系!

如何解决

  1. 先生成spec文件,使用之前的打包命令即可生成
pyinstaller -F -w -i table.ico TDTool.py
  1. 修改spec文件,将我们的图标文件添加到打包资源文件中
    (图标文件我放到了ico目录下,我们在Analysis的datas中添加要打包的资源,这是一个元组列表,元组的第一个参数是当前资源路径,第二个参数是目标路径。这样打包成一个exe后,当exe运行时,会在临时目录中释放这些资源文件)
# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(['TDTool.py'],
             pathex=[],
             binaries=[],
             datas=[("ico", "ico")],
  1. 修改代码,将图标文件的路径需改为exe运行时临时目录中的图标文件目录
def resource_path(self, relative_path):
"""将相对路径转为exe运行时资源文件的绝对路径"""
   if hasattr(sys, '_MEIPASS'):
       base_path = sys._MEIPASS		# 只有通过exe运行时才会进入这个分支,它返回的是exe运行时的临时目录路径
   else:
       base_path = os.path.abspath(".")
   return os.path.join(base_path, relative_path)

设置图标的路径

icon = self.resource_path(os.path.join("ico", "table.png"))
self.setWindowIcon(QtGui.QIcon(icon))
  1. 打包
pyinstaller TDTool.spec
  1. 验证
    删掉ico下的table.png或改名,然后双击exe运行,左上角图标显示正常,问题解决。
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值