首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyinstaller将图像文件夹嵌入到-onefile-windowed应用程序中。

Pyinstaller将图像文件夹嵌入到-onefile-windowed应用程序中。
EN

Stack Overflow用户
提问于 2019-10-01 12:34:19
回答 1查看 1.5K关注 0票数 3

我正在尝试将包含图像的文件夹嵌入到生成的(使用PyInstaller)可执行文件中。但对我不起作用。即使有一个简单的图像!

我的main.spec文件中的变量如下所示:

代码语言:javascript
复制
datas=[ ('C:\\Users\\<user>\\dir1\\dir2\\MyApp\\images\\*.png', 'images') ],

根据文件:

第一个字符串指定当前系统中的一个或多个文件。第二个指定在运行时包含文件的文件夹的名称.

在python文件中,我读取了如下所示的图像:

代码语言:javascript
复制
self.SetIcon(wx.Icon("images\\myicon.png"))

最后,我是如何使用*.exe将所有内容打包到PyInstaller中的:

代码语言:javascript
复制
pyinstaller --onefile --windowed --icon=images\main32x32.ico main.spec

我得到了以下错误:

代码语言:javascript
复制
Failed to load image from file "images\myicon.png"

有人能告诉我我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-02 07:26:42

当您想将文件嵌入到可执行文件中时,需要执行两个步骤:

首先,将它与add-data一起添加到您的可执行文件中(就像您已经做的那样)。接下来,在运行时从提取的路径加载文件。

在这里,您试图从images/myicon.png加载文件,路径就在可执行文件的旁边。不过,该文件并不存在,同时,运行时文件将在临时目录(例如C:/Users/<user>/AppData/Local/Temp/_MEIXXX )中提取。所以它需要从那个目录中加载。

您可以使用sys._MEIPASS获取提取的文件所在的临时路径。此外,您还可以创建一个函数来加载外部文件:

代码语言:javascript
复制
import os
import sys


def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)


self.SetIcon(wx.Icon(resource_path("images/myicon.png")))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58184903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档