簡體   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