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服务器拒绝服务攻击代码
Jan 16 Python
python字符串连接方法分析
Apr 12 Python
Python基础中所出现的异常报错总结
Nov 19 Python
使用DataFrame删除行和列的实例讲解
Apr 08 Python
Python的多维空数组赋值方法
Apr 13 Python
Python模拟登录的多种方法(四种)
Jun 01 Python
用python实现k近邻算法的示例代码
Sep 06 Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 Python
python pygame实现挡板弹球游戏
Nov 25 Python
Python lambda表达式原理及用法解析
Aug 18 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 Python
python爬虫如何解决图片验证码
Feb 14 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 中执行系统外部命令
2006/10/09 PHP
表单复选框向PHP传输数据的代码
2007/11/13 PHP
php中的字符编码转换函数用法示例
2014/10/20 PHP
php两种无限分类方法实例
2015/04/21 PHP
javascript的事件描述
2006/09/08 Javascript
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
JS获取URL中的参数数据
2013/12/05 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
jquery.map()方法的使用详解
2015/07/09 Javascript
jQuery轻松实现表格的隔行变色和点击行变色的实例代码
2016/05/09 Javascript
如何使用headjs来管理和异步加载js
2016/11/29 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
js实现鼠标拖动功能
2017/03/20 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
JavaScript类的继承操作实例总结
2018/12/20 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python去掉字符串中重复字符的方法
2014/02/27 Python
Python使用time模块实现指定时间触发器示例
2017/05/18 Python
丝芙兰加拿大官方网站:SEPHORA加拿大
2018/11/20 全球购物
机械设计毕业生自荐信
2014/02/02 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
超市创意活动方案
2014/08/15 职场文书
奉献爱心演讲稿
2014/09/04 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
Java常用工具类汇总 附示例代码
2021/06/26 Java/Android
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers