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网络爬虫采集联想词示例
Feb 11 Python
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
Jul 04 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 Python
详解Django rest_framework实现RESTful API
May 24 Python
详谈Pandas中iloc和loc以及ix的区别
Jun 08 Python
python实现简易数码时钟
Feb 19 Python
Python数据抓取爬虫代理防封IP方法
Dec 23 Python
python实现登录密码重置简易操作代码
Aug 14 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
Python如何省略括号方法详解
Mar 21 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
Aug 17 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和AJAX创建RSS聚合器的代码
2007/03/13 PHP
php集成环境xampp中apache无法启动问题解决方案
2014/11/18 PHP
PHP模块memcached使用指南
2014/12/08 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
ecshop添加菜单及权限分配问题
2017/11/21 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
vue2.0安装style/css loader的方法
2018/03/14 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
2019/04/20 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
Django框架多表查询实例分析
2018/07/04 Python
Python多进程fork()函数详解
2019/02/22 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
事业单位个人应聘自荐信
2013/09/21 职场文书
工商管理专业实习生自我鉴定
2013/09/29 职场文书
金融专业个人的自我评价
2013/10/18 职场文书
保险专业自荐信范文
2014/02/20 职场文书
实习单位评语
2014/04/26 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
签约仪式致辞
2015/07/30 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android