用pyinstaller打包时的图标问题

efonfighting 2020-02-16 原文

用pyinstaller打包时的图标问题

前言

因为昨天重新研究了下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("'")

然后执行它,结果是这样的:

  • 然后我们在我们要打包的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文件,然后就可以发布了!

参考

  • 《一种使用pyinstaller时图标问题解决方案》:https://www.cnblogs.com/it-tsz/p/10534688.html

一番雾语:等日更完了一番一定好好发软件版本~

发表于
2020-02-16 20:35 
efonfighting 
阅读(
评论(
编辑 
收藏

 

版权声明:本文为efonfighting原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/efonfighting/p/12318585.html

用pyinstaller打包时的图标问题的更多相关文章

随机推荐

  1. 我的软件测试故事:成长、迷茫、奋斗 – 锅边糊

    我的软件测试故事:成长、迷茫、奋斗 前言     测试工作6年,经历过不同产品、共事过不同专业背景、能力的同事 […]...

  2. 性能测试问产品 压力测试指标给多少?TPS、响应时间、并发量的要求是多少?这样计算

    先说结论 一般推荐,如果你: 没啥人用的服务 tps 20,返回有300ms就行了 十万到百万级的服务,响应能 […]...

  3. 数学体系概述、主要分支、学科分类(MSC)、构成联系和应用数学简介

    https://www.sohu.com/a/332830388_120054637 目录 A数学体系概述、主 […]...

  4. 《挪威的森林》总结

    初中时候接触的书,那是一个还在读《夏至未至》的时代,印象很深,在一个一元借书的书店拿起了这本书,因为名字和伍佰 […]...

  5. flink DataStream API使用及原理

    传统的大数据处理方式一般是批处理式的,也就是说,今天所收集的数据,我们明天再把今天收集到的数据算出来,以供大家 […]...

  6. MySQL错误:2003-Can\’t connect to MySQL server on \’localhost\'(10061 \”unknown error\”)

    数据库错误代码16001解决方案   今天数据库出了一点错误之后决定重装一下,结果卡在了一个问题上,连装了5遍 […]...

  7. RHCE认证过程

    RHCE认证,即红帽认证工程师(Red Hat Certified Engineer)的简称,认证内容包括DN […]...

  8. 8个3D视觉效果的HTML5动画欣赏

    现在的网页中应用了越来越多的3D应用,特别是基于HTML5 Canvas的动画特效,让用户有一种非常震撼的视觉 […]...

展开目录

目录导航