前言

之前py打包的exe一直是不涉及图片等资源的,直到我引入图片后打包,再双击exe发现直接提示未找到资源。

分析

我py代码中的图片引入使用的是项目相对路径,打包时pyinstaller只会引入py模块,这种路径引入的资源其实是不会打包进exe的。有人想的是可以直接将资源放到exe旁边,但这不是最优雅的方法,你发布exe还得给人家一堆相关资源文件,其实想要解决此类无法打包资源的问题其实只需要做两件事:1、修改spec打包配置。2、动态获取资源路径。

步骤

  • 这是我的项目结构

图片资源在src下的img目录中,我在main.py中需要使用其中的图片。

  • 在main.py中定义动态获取资源路径的函数
#获取资源路径
def getPath(relative_path):
# 判断是否为frozen状态(即为打包运行状态)
if getattr(sys, 'frozen', False):
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)# 返回真实路径

我们需要先获取项目当前状态,判断是否为frozen状态(即为打包运行状态),是的话先获取 MEIPASS路径(MEIPASS为双击exe时系统分配的临时工作目录),不是的话直接获取绝对路径,最后返回真实路径。

  • 在需要获取路径的地方直接使用getPath即可,比如我要修改exe窗体图标,这样即可:
root.iconbitmap(getPath(os.path.join("src","img/logo.ico")))

我要在tk界面使用Label添加图片,这样即可:

imgImg = ImageTk.PhotoImage(Image.open(getPath(os.path.join("src","img/img.png"))))
Label(imgFrame,image=imgImg).grid(column = 0,row = 0)
  • 最后修改spec打包配置(不懂spec的看这儿:https://xiblogs.top/?id=57 )中Analysis的datas:



    datas中第一个src表示你需要打包的资源目录,第二个src表示打包成exe后双击exe时释放资源在MEIPASS目录下的具体位置,这是我打包运行时系统释放资源的位置,你可以看到src就在这里,exe中的图片也加载进界面了:

结语

值得注意的是该目录打开exe即生成,关闭exe即删除,不可在此长久保存文件。类似于我篇文章(https://xiblogs.top/?id=65 )修改exe图标使用base64转换ico的逻辑,当然,你现在可以直接使用MEIPASS来处理了。

原文链接:https://xiblogs.top/?id=66

python将资源打包进exe的更多相关文章

  1. 控件注册 - 利用资源文件将dll、ocx打包进exe文件(C#版)

    原文:控件注册 - 利用资源文件将dll.ocx打包进exe文件(C#版) 很多时候自定义或者引用控件都需要注册才能使用,但是如何使要注册的dll或ocx打包到exe中,使用户下载以后看到的只是一个e ...

  2. Python Windows下打包成exe文件

    Python Windows 下打包成exe文件,使用PyInstaller 软件环境: 1.OS:Win10 64 位 2.Python 3.7 3.安装PyInstaller 先检查是否已安装Py ...

  3. python爬虫程序打包为exe程序并在控制台下运行

    上一篇文章实现了爬取任意两个用户共同想读的图书的python程序.现在此程序打包为exe程序. 使用pyinstaller实现此功能.在pyinstaller官网下载http://www.pyinst ...

  4. python开发环境配置和python源码打包生成exe可执行文件

    Windows下开发环境准备 1.分别安装:python2和python32.安装Python的集成工具:Anaconda3.安装Pycharm Pycharm设置 设置: File->Sett ...

  5. python多进程程序打包成exe的问题

    粘贴一下部分的多进程代码 if __name__ == '__main__': """"流程模拟""" multiprocessi ...

  6. python用pyinstaller打包成exe文件

    版本为Python2.7 一.安装Pyinstaller 1.安装pywin32 下载安装文件:查找到跟自己适用的python版本及window系统版本匹配的pywin32,下载后安装  使用pip命 ...

  7. Python | 用Pyinstaller打包发布exe应用

    参考:https://jingyan.baidu.com/article/a378c960b47034b3282830bb.html https://ask.csdn.net/questions/72 ...

  8. 利用cxfreeze将Python 3.3打包成exe程序

    参考自别人的博文:http://blog.csdn.net/yatere/article/details/6667230 步骤如下: (1) 下载cxfreeze后安装(先得安装python 3.3) ...

  9. 将Python执行代码打包成exe可执行文件

    安装pyinstaller pip3 install pyinstaller 进入py文件目录,执行以下指令 pyinstaller -F -w <文件名.py>,-F代表生成可执行文件, ...

  10. python把源代码打包成.exe文件

    1.在windows命令行把当前文件夹用cd命令切换到源代码所在文件夹. 2.输入命令:pyinstaller -w -F main.py

随机推荐

  1. .NET Framework 4 请求https接口

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  2. BZOJ 1461 题解

    考虑设计一个哈希函数 \(hash(x) = f(x) \times base^x\). 其中 \(f(x)\) 表示 \(\sum_{j=1}^{i-1} [j <i]\). 然后类似于滑动窗 ...

  3. 大语言模型的应用探索—AI Agent初探!

    前言 大语言模型的应用之一是与大语言模型进行聊天也就是一个ChatBot,这个应用已经很广泛了. 接下来的一个应用就是AI Agent. AI Agent是人工智能代理(Artificial Inte ...

  4. Idea 2020.1 编译SpringBoot项目Kotlin报错

    导读 今天公司有个项目莫名其妙的运行不起来,提示Kotlin版本兼容问题,网上找到解决方案后,整理下来. 错误信息 Error:Kotlin: Module was compiled with an ...

  5. c 语言学习第四天

    if 语句 格式: // 1 // 其他语句... if(表达式){ // 其他语句... } // 其他语句... // 2 if(表达式){ }else{ } // 3 if(表达式1){ }el ...

  6. 使用requests库实现http请求

    1.发送请求 import requests url = 'http://www.tipdm.com/tipdm/index.html' rqq = requests.get(url) In [ ]: ...

  7. 自动修改网卡 IP

    1. 讲个故事 我的一同事需要调试 PLC,需要经常修改电脑 IP 在各个工位的 PLC 间来回连接.于是,每次需要改变 IP 的时候都是手动点开网络管理界面然后再修改.终于有一天,一天改 80 次 ...

  8. 高程读后感(四)— 关于BOM本人容易忽略的知识点总结

    目录 window对象 window对象上属性及方法 超时调用setTimeout和间歇调用setInterval BOM location对象及其位置操作 history对象 window对象 wi ...

  9. 在Windows系统中解决端口占用问题

    在Windows系统中,你可以通过以下步骤查询并结束占用8001端口的进程: 查询占用8001端口的进程: 打开命令提示符(CMD)或者PowerShell,并执行以下命令:   netstat -a ...

  10. [oeasy]python0021_宝剑镶宝石_爱之石中剑_批量替换_特殊字符_特殊颜色

    继续运行 回忆上次内容 上次 运行了 game.py 分析了 game.py 也大致读懂了 game.py       添加图片注释,不超过 140 字(可选)   这个 程序 可以进一步 进行修改吗 ...