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

Posted

技术标签:

【中文标题】带有 PyInstaller 挂钩的 KivyMD - 图像未显示在独立 .exe 中【英文标题】:KivyMD with PyInstaller hooks - Images not showing in the standalone .exe 【发布时间】:2021-01-16 10:30:30 【问题描述】:

目标

我正在使用带有 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 和 this)在独立设备中添加图像/文件,我创建了一个如下所示的规范文件:

# -*- 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”(元组列表)中,我还尝试了其他选项(现已注释掉),但没有人允许图像出现在独立文件中。

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

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

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

【问题讨论】:

试试( 'media/myicon.png', 'media' ) # Single file。注意正斜杠。 【参考方案1】:

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

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

【讨论】:

非常感谢约翰,它现在可以工作了!我错过了“if getattr..”代码。

以上是关于带有 PyInstaller 挂钩的 KivyMD - 图像未显示在独立 .exe 中的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyinstaller 时没有名为 kivymd.effects 的模块

KivyMD 带有下拉菜单的文本字段

带有 id 的 kivymd 参考

用于 MDTextField 的带有 Kivy / KivyMD 的数字键盘

NLTK 不能在带有 KivyMD 的 Android Buildozer 应用程序中工作

带有额外空格的 Python KivyMD MDBottomSheet