zoukankan      html  css  js  c++  java
  • 用pyinstaller打包时的图标问题

    前言

    因为昨天重新研究了下python的打包方法,今天一番准备把之前写的一个pdf合并软件重新整理一下,打包出来。

    但在打包的过程中仍然遇到了一些问题,半年前一番做打包的时候也遇到了一些问题,现在来看,解决这些问题思路清晰多了,这里记录下。

    问题

    打包成功,但运行时提示Failed to execute script xxx。这里又分很多种原因,这时不要用-w打包,然后在终端.xxx.exe的方式运行,就可以看到输出日志了。

    原因一

    D:2-python2019-09-30_pdf_optdist>.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:2-python2019-09-30_pdf_optdist>.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 ".assertefon.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): ')
        f.write(' def __init__(self): ')
        f.write(" self.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

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

  • 相关阅读:
    【面试必备】CSS盒模型的点点滴滴
    2013年终总结——求评点求指导
    【面试必备】javascript的原型和继承
    支持断点续传的文件上传插件——Huploadify-V2.0来了
    【面试必备】javascript操作DOM元素
    走进AngularJs(八) ng的路由机制
    走进AngularJs(七) 过滤器(filter)
    走进AngularJs(六) 服务
    HTML5+flash打造兼容各浏览器的文件上传方案
    免费的HTML5版uploadify送上
  • 原文地址:https://www.cnblogs.com/efonfighting/p/12318585.html
Copyright © 2011-2022 走看看