带有 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 的模块
用于 MDTextField 的带有 Kivy / KivyMD 的数字键盘