ToB企服应用市场:ToB评测及商务社交产业平台

标题: python将资源打包进exe [打印本页]

作者: 尚未崩坏    时间: 2024-2-15 06:58
标题: python将资源打包进exe
前言

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

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

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

  1. #获取资源路径
  2. def getPath(relative_path):
  3.     # 判断是否为frozen状态(即为打包运行状态)
  4.     if getattr(sys, 'frozen', False):
  5.         base_path = sys._MEIPASS
  6.     else:
  7.         base_path = os.path.abspath(".")
  8.     return os.path.join(base_path, relative_path)# 返回真实路径
复制代码
我们需要先获取项目当前状态,判断是否为frozen状态(即为打包运行状态),是的话先获取     MEIPASS路径(MEIPASS为双击exe时系统分配的临时工作目录),不是的话直接获取绝对路径,最后返回真实路径。
  1. root.iconbitmap(getPath(os.path.join("src","img/logo.ico")))
复制代码
我要在tk界面使用Label添加图片,这样即可:
  1. imgImg = ImageTk.PhotoImage(Image.open(getPath(os.path.join("src","img/img.png"))))
  2. Label(imgFrame,image=imgImg).grid(column = 0,row = 0)
复制代码
结语

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4