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之禅》中对于Python编程过程中的一些建议
Apr 03 Python
Python生成不重复随机值的方法
May 11 Python
Python实现栈的方法
May 26 Python
详解使用Python处理文件目录的相关方法
Oct 16 Python
Python实现的括号匹配判断功能示例
Aug 25 Python
详解django中使用定时任务的方法
Sep 27 Python
Python实现二维曲线拟合的方法
Dec 29 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
Jan 08 Python
django与小程序实现登录验证功能的示例代码
Feb 19 Python
Python lambda表达式原理及用法解析
Aug 18 Python
python/golang 删除链表中的元素
Sep 14 Python
浅析Python模块之间的相互引用问题
Feb 26 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 模拟get_headers函数的代码示例
2013/04/27 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
javascript 写类方式之十
2009/07/05 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
BootStrap tab选项卡使用小结
2020/08/09 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
代码详解Vuejs响应式原理
2017/12/20 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
vue实现的下拉框功能示例
2019/01/29 Javascript
微信小程序如何获取群聊的openGid以及名称详解
2019/07/17 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
跟老齐学Python之开始真正编程
2014/09/12 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
浅谈python的深浅拷贝以及fromkeys的用法
2019/03/08 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
iPython pylab模式启动方式
2020/04/24 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
浅谈HTML5 &amp; CSS3的新交互特性
2016/07/19 HTML / CSS
捷克领先的户外服装及配件市场零售商:ALPINE PRO
2018/01/09 全球购物
SQL中where和having的区别
2012/06/17 面试题
Delphi笔试题
2016/11/14 面试题
班级活动策划书
2014/02/06 职场文书
3分钟演讲稿
2014/04/30 职场文书
教室布置标语
2014/06/26 职场文书
2014年预算员工作总结
2014/12/05 职场文书
2016年公司新年寄语
2015/08/17 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers