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中类的一些方法分析
Sep 25 Python
详解Python的Django框架中的通用视图
May 04 Python
全面了解python中的类,对象,方法,属性
Sep 11 Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
Sep 25 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
Oct 14 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 Python
Python HTMLTestRunner可视化报告实现过程解析
Apr 10 Python
Python Excel vlookup函数实现过程解析
Jun 22 Python
python右对齐的实例方法
Jul 05 Python
Python pip使用超时问题解决方案
Aug 03 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
Dec 04 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的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
网页中的图片的处理方法与代码
2009/11/26 Javascript
JavaScript 原型继承之构造函数继承
2011/08/26 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
jquery 清空file域示例(兼容个浏览器)
2013/10/11 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
谈谈第三方App接入微信登录 解读
2016/12/27 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
javascript实现滑动解锁功能
2017/03/22 Javascript
初学者AngularJS的环境搭建过程
2017/10/27 Javascript
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
Python读写Excel文件的实例
2013/11/01 Python
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
python os.fork() 循环输出方法
2019/08/08 Python
Python 下载及安装详细步骤
2019/11/04 Python
Python中求对数方法总结
2020/03/10 Python
远程调用的原理
2014/07/05 面试题
幼儿园元旦家长感言
2014/02/27 职场文书
安全教育感言
2014/03/04 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
司法助理专业自荐书
2014/06/13 职场文书
通信工程求职信
2014/07/16 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
个人工作作风整改措施思想汇报
2014/10/13 职场文书
稽核岗位职责范本
2015/04/13 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书