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使用append合并两个数组的方法
Apr 28 Python
django实现分页的方法
May 26 Python
Python生成任意范围任意精度的随机数方法
Apr 09 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
Python 矩阵转置的几种方法小结
Dec 02 Python
Python xlrd excel文件操作代码实例
Mar 10 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 Python
关于Python错误重试方法总结
Jan 03 Python
Python自动操作神器PyAutoGUI的使用教程
Jun 16 Python
Python软件包安装的三种常见方法
Jul 07 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 adodb连接mssql解决乱码问题
2009/06/12 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
laravel 解决Validator使用中出现的问题
2019/10/25 PHP
浅谈javascript 迭代方法
2015/01/21 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
2016/03/08 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
javascript模块化简单解析
2016/04/07 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
js实现旋转木马效果
2017/03/17 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
js实现无缝轮播图
2020/03/09 Javascript
[49:21]2018DOTA2亚洲邀请赛3月30日 小组赛B组 Effect VS iG
2018/03/31 DOTA
Python3.x和Python2.x的区别介绍
2013/02/12 Python
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
python修改FTP服务器上的文件名
2019/09/11 Python
Python实现搜索算法的实例代码
2020/01/02 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
python怎么对数字进行过滤
2020/07/05 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
浅析HTML5的WebSocket与服务器推送事件
2016/02/19 HTML / CSS
大学生职业规划论文
2014/01/11 职场文书
模特职业生涯规划范文
2014/02/26 职场文书
体育之星事迹材料
2014/05/11 职场文书
学校运动会广播稿
2014/10/11 职场文书
2014年关工委工作总结
2014/11/17 职场文书
优秀团员事迹材料
2014/12/25 职场文书
党员争先创优承诺书
2015/01/20 职场文书
埃及王子观后感
2015/06/16 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
python区块链实现简版工作量证明
2022/05/25 Python