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检测手机QQ在线状态的脚本代码
Feb 10 Python
pyqt4教程之widget使用示例分享
Mar 07 Python
Python中的choice()方法使用详解
May 15 Python
python动态参数用法实例分析
May 25 Python
python下调用pytesseract识别某网站验证码的实现方法
Jun 06 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
python如何生成各种随机分布图
Aug 27 Python
基于python if 判断选择结构的实例详解
May 06 Python
通过PHP与Python代码对比的语法差异详解
Jul 10 Python
Python集合基本概念与相关操作实例分析
Oct 30 Python
Python3自定义json逐层解析器代码
May 11 Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 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数组索引与键值操作技巧实例分析
2015/06/24 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
使用jscript实现二进制读写脚本代码
2008/06/09 Javascript
javascript 禁止复制网页
2009/06/11 Javascript
JavaScript中清空数组的三种方法分享
2011/04/07 Javascript
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
实现点击列表弹出列表索引的两种方式
2013/03/08 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
2015/10/16 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
django的settings中设置中文支持的实现
2019/04/28 Python
python实现倒计时小工具
2019/07/29 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
英国拳击装备购物网站:RDX Sports
2018/01/23 全球购物
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
2015毕业生实习工作总结
2014/12/12 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
校园广播站开场白
2015/06/01 职场文书
标枪加油稿
2015/07/22 职场文书
PHP获取学生成绩的方法
2021/11/17 PHP