繁体   English   中英

SDL2 错误:“无法加载图像<default.png> " 使用 pyinstaller 冻结 kivy 应用程序时</default.png>

[英]SDL2 Error: "Unable to load image <default.png>" when freezing kivy application using pyinstaller

我无法使用 pyinstaller 生成工作 exe(应用程序的名称是 settings_gui)。

运行时错误:(完整日志

[WARNING           ] [Image       ] Unable to load image <<project_path>\dist\SETTIN~1\kivy_install\data\glsl\default.png>
[CRITICAL          ] [Window      ] Unable to find any valuable Window provider
at all!
sdl2 - Exception: SDL2: Unable to load image
  File "site-packages\kivy\core\__init__.py", line 67, in core_select_lib
  File "site-packages\kivy\core\window\window_sdl2.py", line 138, in __init__
  File "site-packages\kivy\core\window\__init__.py", line 722, in __init__
  File "site-packages\kivy\core\window\window_sdl2.py", line 255, in create_wind
ow
  File "site-packages\kivy\core\window\__init__.py", line 897, in create_window
  File "kivy\graphics\instructions.pyx", line 756, in kivy.graphics.instructions
.RenderContext.__init__ (kivy\graphics\instructions.c:10729)
  File "site-packages\kivy\core\image\__init__.py", line 512, in __init__
  File "site-packages\kivy\core\image\__init__.py", line 700, in _set_filename
  File "site-packages\kivy\core\image\__init__.py", line 430, in load
  File "site-packages\kivy\core\image\__init__.py", line 198, in __init__
  File "site-packages\kivy\core\image\img_sdl2.py", line 42, in load

[CRITICAL          ] [App         ] Unable to get a Window, abort.
 Exception SystemExit: 1 in 'kivy.properties.dpi2px' ignored
[INFO              ] [Text        ] Provider: sdl2
 Traceback (most recent call last):
   File "settings_gui.py", line 26, in <module>
 AttributeError: 'NoneType' object has no attribute 'clearcolor'
Failed to execute script settings_gui

出了什么问题? 我检查了<project_path>/dist/settings_gui/kivy_install/data/glsl/default.png ,它就在那里。 我觉得很奇怪,但是路径是SETTING~1 ,这正常吗? 我已经看到这个线程建议通过_MEIPASS重定向资源,但这没有帮助 - 预期,因为我不是在单文件模式下构建我的应用程序。

任何有关如何解决此问题的提示都值得赞赏。

编辑

更多信息:

  • 没有 pyinstaller,应用程序运行得非常好——除非我关闭它或停止它; 当我这样做时, python 崩溃。
  • 当我构建我的应用程序时,kivy window 会立即打开并崩溃。 我总是关闭它并继续构建过程。
  • 我的.spec 文件
  • 构建日志

我设法通过复制文件解决了这个问题

From: [Python]\share\sdl2\bin\libpng16-16.dll
To:   [Dist]\<projectName>\libpng16-16.dll

该文件的一个实例已经存在,但我替换它的那个实例大约大 20kb(从 198kb 到 213kb)。

重要的部分是我的应用程序现在可以运行,并且我没有更改任何其他内容。

我有同样的问题。

来自 kivy 文档

备用安装

前面的示例使用了例如 *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins + gstreamer.dep_bins)],以使 PyInstaller 添加这些依赖项使用的所有 dll。 如果没有使用wheels 方法安装kivy,这些命令将不起作用,例如kivy.deps.sdl2 将无法导入。 相反,必须找到这些 dll 的位置,并以与示例类似的方式手动将它们传递给 Tree 类。

改变了

*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],

类似于

Tree('C:\\Python27\\share\\sdl2\\bin\\'),
Tree('C:\\Python27\\share\\glew\\bin\\'),

它仍然必须关闭 pyinstaller 中的窗口构建,但现在应用程序 .exe 可以工作

这是我的屏幕截图

我已经解决了这个问题,请在导入 kivy 模块之前添加此代码:

import os
os.environ['KIVY_IMAGE'] = 'pil'

from kivy.app import App

并执行pip install pillow

将此代码添加到项目目录中的 xxx.spec 文件中以解决此问题:

# -*- mode: python ; coding: utf-8 -*-
from kivy_deps import sdl2, glew       #at the beginning of xxx.spec
...
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
               strip=False,
               upx=True,
               upx_exclude=[],
               name='KivyApp')

然后,在您的项目目录中运行此命令以打包您的 kivy 应用程序:

 pyinstaller xxx.spec

引用自 kivy 官方文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM