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
出了什么问题?我检查了<project_path>/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\<myname>\AppData\Local\Enthought\Canopy\edm\envs\User\share\sdl2\bin
目录(213 ko)中的libpng16-16.dll
文件替换为C:\Users\<myname>\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 打包后崩溃