带有 PyInstaller 挂钩的 KivyMD - 图像未显示在独立的 .exe 中

KivyMD with PyInstaller hooks - Images not showing in the standalone .exe

目标

我使用带有 PyInstaller 挂钩的 kivymd 来创建独立的 .exe。

问题

独立 .exe 中的一切正常,除了未显示的图像。

请注意,图像会出现在从脚本执行的应用程序中,但不会出现在独立的应用程序中。

图片位置

图像存储在名为 'media' 的文件夹中,并与脚本中的相对路径链接。请参阅下面关于 MDToolbar

中的“myicon.png”的示例
MDToolbar:
    title: "My title"
    left_action_items: [['media\myicon.png', lambda x: None]]
    elevation: 10

文件.SPEC

按照文档 (this and this) 在独立版本中添加 images/files,我创建了一个如下所示的规范文件:

# -*- mode: python ; coding: utf-8 -*-
import sys
import os
from kivy_deps import sdl2, glew
from kivymd import hooks_path as kivymd_hooks_path
path = os.path.abspath(".")


added_files = [                      

    ( 'media\myicon.png', 'media' ) # Single file
    # ( 'media/myicon.png', '.' ), # Single file
    # ( 'media/myicon.png', '.' ), # Single file
    # ( '/media/data', 'data' ), # Folder
    # ( '/media/*.png') # multiple files # prova mia
    # ( '/media/sfx/*.mp3', 'sfx' ) # multiple files

    # ( '.\media\myicon.png', 'media' )  # # hookspath='.\hooks\',
]


a = Analysis(
    ["main.py"],                              
    pathex=[path],
    hookspath=[kivymd_hooks_path],
    datas = added_files,     
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=None,
    noarchive=False,
)

pyz = PYZ(a.pure, a.zipped_data, cipher=None)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,             
    *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
    debug=False,
    strip=False,
    upx=True,
    name="myname",                       
    console=False,
    icon='myicon.ico'    
)

如您所见,在“added_files”(元组列表)中,我还尝试了其他选项(现在已注释掉),但没有人允许图像出现在独立版中。

目前我认为这个问题可能与以下两个可能的问题之一有关:

  1. 语法错误(例如'media\myicon.png'、'media')
  2. 关联“added_files”、“datas=added_files”、“a.datas”的逻辑错误

你能帮我解决一下吗? 提前致谢

根据我的经验,我使用过以下形式:

added_files = [ ( 'media/myicon.png', 'media' ) # Single file]

使用正斜杠。

然后在我的 main.py 顶部添加:

if getattr(sys, 'frozen', False):
    # this is a Pyinstaller bundle
    kivy.resources.resource_add_path(sys._MEIPASS)
    kivy.resources.resource_add_path(os.path.join(sys._MEIPASS, 'media'))