首页 > 解决方案 > 带有 PyInstaller 挂钩的 KivyMD - 图像未显示在独立 .exe 中

问题描述

目标

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

问题

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

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

图片的位置

图像存储在名为“媒体”的文件夹中,并与脚本中的相对路径链接。请参阅下面有关 MDToolbar 中“myicon.png”的示例

MDToolbar:
    title: "My title"
    left_action_items: [['media\myicon.png', lambda x: None]]
    elevation: 10

文件.SPEC

按照文档(thisthis)在独立设备中添加图像/文件,我创建了一个如下所示的规范文件:

# -*- 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”关联相关的逻辑是错误的。

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

标签: kivypyinstallerkivy-languagekivymd

解决方案


根据我的经验,我使用了以下表格:

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'))

推荐阅读