Python中用pyinstaller打包时的图标问题及解决方法


Posted in Python onFebruary 17, 2020

前言

因为昨天重新研究了下python的打包方法,今天一番准备把之前写的一个pdf合并软件重新整理一下,打包出来。

但在打包的过程中仍然遇到了一些问题,半年前一番做打包的时候也遇到了一些问题,现在来看,解决这些问题思路清晰多了,这里记录下。

问题

打包成功,但运行时提示Failed to execute script xxx。这里又分很多种原因,这时不要用-w打包,然后在终端.\xxx.exe的方式运行,就可以看到输出日志了。

原因一

D:\02-python\2019-09-30_pdf_opt\dist>.\pdfmerge.exe
Traceback (most recent call last):
  File "pdfmerge.py", line 5, in <module>
ModuleNotFoundError: No module named 'PyPDF2'
[47572] Failed to execute script pdfmerge

这个是因为我们打包的时候用的是系统的pyinstaller命令,而系统的python库里没有安装相应的依赖包,这时要么用退出当前的虚拟环境,要么在进入虚拟环境并给虚拟环境在Scripts下面安装pyinstaller命令。

原因二

D:\02-python\2019-09-30_pdf_opt\dist>.\pdfmerge.exe
Traceback (most recent call last):
  File "pdfmerge.py", line 97, in <module>
  File "tkinter\__init__.py", line 1871, in wm_iconbitmap
_tkinter.TclError: bitmap ".\assert\efon.ico" not defined
[95216] Failed to execute script pdfmerge

这个是因为我们在py代码里指定了程序图标,但pyinstaller不能将依赖文件打包到一个exe里,所以需要我们把图标文件拷贝到当前exe目录下。当然,然后另外的解决办法,就是下面我们要讲的把图标打包到代码里的方法。

把图标打包到代码里首先,编写一个py程序,来自动生成一个包含图标内容的类

import base64
with open("icon.py","w") as f:
  f.write('class Icon(object):\n')
  f.write('\tdef __init__(self):\n')
  f.write("\t\tself.img='")
with open("icon.ico","rb") as i:
  b64str = base64.b64encode(i.read())
  with open("icon.py","ab+") as f:
    f.write(b64str)
with open("icon.py","a") as f:
  f.write("'")

然后执行它,结果是这样的:

Python中用pyinstaller打包时的图标问题及解决方法

然后我们在我们要打包的py程序里去指定这个图标:

with open('tmp.ico','wb') as tmp:
    tmp.write(base64.b64decode(Icon().img))
  window.iconbitmap('tmp.ico')
  os.remove('tmp.ico')

原理就是先把Icon类的里ico数据读出来,转换为二进制再写到当前目录生成一个临时ico,然后指定程序图标,最后删除这个临时图标。

这样就能保证我们的程序一定能在当前目录加载图标。一气呵成,速度非常快,并不会看到有生成临时文件。

如果程序里还有其他外部依赖文件,可以按照同样的道理处理。

这样我们的打包过程就完成啦,最终就只有一个exe文件,然后就可以发布了!

总结

以上所述是小编给大家介绍的Python中用pyinstaller打包时的图标问题及解决方法,希望对大家有所帮助!

Python 相关文章推荐
使用Python脚本将Bing的每日图片作为桌面的教程
May 04 Python
Python 3.7新功能之dataclass装饰器详解
Apr 21 Python
基于DATAFRAME中元素的读取与修改方法
Jun 08 Python
Django中的Model操作表的实现
Jul 24 Python
Python模块的加载讲解
Jan 15 Python
Python逐行读取文件中内容的简单方法
Feb 26 Python
python实现微信防撤回神器
Apr 29 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
Python 字符串类型列表转换成真正列表类型过程解析
Aug 26 Python
Python简易计算器制作方法代码详解
Oct 31 Python
python 画函数曲线示例
Dec 04 Python
Python中的 enumerate和zip详情
May 30 Python
Python交互环境下打印和输入函数的实例内容
Feb 16 #Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
Feb 16 #Python
基于python实现微信好友数据分析(简单)
Feb 16 #Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
Feb 16 #Python
python中的 zip函数详解及用法举例
Feb 16 #Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 #Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 #Python
You might like
php使用Jpgraph绘制3D饼状图的方法
2015/06/10 PHP
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
PHP切割汉字的常用方法实例总结
2019/04/27 PHP
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
纯js实现无限空间大小的本地存储
2015/06/18 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
React styled-components设置组件属性的方法
2018/08/07 Javascript
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
python函数定义和调用过程详解
2020/02/09 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
2020/09/20 Python
Html5定位终极解决方案
2020/02/05 HTML / CSS
财务会计专业推荐信
2013/11/30 职场文书
党员自我评价分享
2013/12/13 职场文书
护理专业大学生自我推荐信
2014/01/25 职场文书
国际商务专业毕业生自我鉴定2014
2014/09/27 职场文书
大学生操行评语大全
2014/12/31 职场文书
结婚堵门保证书
2015/05/08 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书
会计专业自荐信范文
2019/05/22 职场文书
导游词之广东佛山(南风古灶)
2019/09/24 职场文书
详解JAVA中的OPTIONAL
2021/06/14 Java/Android
详解MindSpore自定义模型损失函数
2021/06/30 Python