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

Posted

技术标签:

【中文标题】SDL2 错误:使用 pyinstaller 冻结 kivy 应用程序时“无法加载图像 <default.png>”【英文标题】:SDL2 Error: "Unable to load image <default.png>" when freezing kivy application using pyinstaller 【发布时间】:2017-07-29 00:40:33 【问题描述】:

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

运行时错误:(Full log)

[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

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

感谢任何有关如何解决此问题的提示。

编辑

更多信息:

没有 pyinstaller,应用程序运行得非常好 - 除非我关闭它或以其他方式停止它;当我这样做时,python 崩溃了。 当我构建我的应用程序时,一个 kivy 窗口打开并立即崩溃。我总是关闭它并继续构建过程。 My .spec file Logs of the build

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

感谢您的提示。我发现here 可能与 zlib1.dll 发生冲突,但事实并非如此。在我这边,我不得不将C:\Users\&lt;myname&gt;\AppData\Local\Enthought\Canopy\edm\envs\User\share\sdl2\bin 目录(213 ko)中的libpng16-16.dll 文件替换为C:\Users\&lt;myname&gt;\AppData\Local\Enthought\Canopy\edm\envs\User\share\gstreamer\bin(1104 ko)中的文件 太棒了!这是唯一可行的解​​决方案。 太好了,谢谢!此解决方案应标记为答案【参考方案2】:

我也有同样的问题。

来自 kivy docs

备用安装

前面的例子使用了例如*[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 可以工作

【讨论】:

谢谢。我会试试的。然而,因为我的 Windows 安装还是有点坏,我决定在 VirtualBox 上安装 Win7 并从那里构建——它运行良好,即使我也没有在那里使用***。 |如果sdl2.dep_bins 不起作用,就不会有sdl2.dll 和default.png 等文件夹,对吧?因为他们都在那里。 你救了我的命和所有对 import sdl2 有问题的人。谢谢!

以上是关于SDL2 错误:使用 pyinstaller 冻结 kivy 应用程序时“无法加载图像 <default.png>”的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pyinstaller 冻结 Python 程序时摆脱控制台输出

使用 pyinstaller 或 fbs 冻结应用程序会更改 pyside2 应用程序的默认配色方案

使用 Fbs/PyInstaller 冻结我的应用程序导致在另一台电脑上启动时无法执行 pyi_rth_qt5plugins

由于窗口问题,Kivy 应用程序在使用 pyinstaller 打包后崩溃

为啥我在使用 SDL2 的 C++ 中出现“无匹配令牌错误”?

Kivy 错误(python 2.7):sdl2 导入错误