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

Posted

技术标签:

【中文标题】由于窗口问题,Kivy 应用程序在使用 pyinstaller 打包后崩溃【英文标题】:Kivy app crashes after being packaged with pyinstaller due to window issue 【发布时间】:2016-10-31 00:18:06 【问题描述】:

我正在尝试使用 Pyinstaller 打包我的 kivy 项目,但它崩溃并吐出这个

[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_window

 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

[INFO              ] [Audio       ] Providers: audio_sdl2 (audio_ffpyplayer ignored)
[CRITICAL          ] [App         ] Unable to get a Window, abort.
Exception ignored in: 'kivy.properties.dpi2px'
Traceback (most recent call last):
File "site-packages\kivy\utils.py", line 513, in __get__
File "site-packages\kivy\metrics.py", line 175, in dpi
File "site-packages\kivy\base.py", line 126, in ensure_window
SystemExit: 1
[CRITICAL          ] [App         ] Unable to get a Window, abort.
Exception ignored in: 'kivy.properties.dpi2px'
Traceback (most recent call last):
File "site-packages\kivy\utils.py", line 513, in __get__
File "site-packages\kivy\metrics.py", line 175, in dpi
File "site-packages\kivy\base.py", line 126, in ensure_window
SystemExit: 1
[CRITICAL          ] [App         ] Unable to get a Window, abort.

我没有创建自己的规范文件,我选择通过命令行传递所需的参数来创建任何建议?

这是pyinstaller生成的spec文件

# -*- mode: python -*-

block_cipher = None


a = Analysis(['apv.py'],
         pathex=['C:\\Python34\\Lib\\site-packages\\kivy', 'C:\\Python34', 'C:\\Python34\\Lib', 'C:\\Python34\\Lib\\site-packages', 'C:\\Users\\suroh\\Desktop\\my-python-modules', 'C:\\Python34\\Lib\\site-packages\\kivy\\deps', 'C:\\Python34\\Lib\\site-packages\\kivy\\graphic', 'C:\\Python34\\DLLs', 'C:\\Python34\\libs', 'C:\\Python34\\Scripts', 'C:\\Python34\\share\\sdl2\\bin', 'C:\\Python34\\share\\glew\\bin', 'C:\\Python34\\share', 'C:\\Python34\\Tools', 'C:\\Python34\\Lib\\ctypes', 'C:\\Python34\\Lib\\distutils', 'C:\\Users\\suroh\\Desktop\\Python Projects\\testp\\Beta 01'],
         binaries=None,
         datas=None,
         hiddenimports=[],
         hookspath=[],
         runtime_hooks=[],
         excludes=['pygame'],
         win_no_prefer_redirects=False,
         win_private_assemblies=False,
         cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
         cipher=block_cipher)
exe = EXE(pyz,
      a.scripts,
      exclude_binaries=True,
      name='apv',
      debug=False,
      strip=False,
      upx=True,
      console=False , icon='LauncherIcon.ico')
coll = COLLECT(exe,
           a.binaries,
           a.zipfiles,
           a.datas,
           strip=False,
           upx=True,
           name='apv')

【问题讨论】:

请添加规格文件。我认为您可能没有将 deps 添加到规范中,因为 Unable to load image 想要 sdl2 文件夹中的一些文件(至少在我遇到的错误中)。 正如我所说,我没有使用自己的规范文件,pyinstaller 确实生成了它自己的,所以我想我会把它放上来。 你可以先尝试安装pygame。请参考:***.com/questions/24865559/… 【参考方案1】:

如果您没有创建 spec 文件,您仍然需要将 here 的依赖项打包到 Collect() 中。

正如pyinstaller的docs中提到的:

您可以在 pyinstaller 命令行上提供其他文件。

这意味着您可以使用--add-data,或者您可以将规范转储到某处并使用--specpath 手动编辑它。 Here 是 Collect() 基本上用来打包东西的。

编辑: 是的,你肯定错过了部门。看kivy的规格。

如果您选择--add-data,则应检查其中的kivy.deps 文件夹和__init__()s,因为它们会告诉您要查找的路径。但是手动编辑规范更省时。

【讨论】:

谢谢伙计,这是我找到的最明确的答案,我不敢相信我错过了它,但仍然感谢你,因为这是一个巨大的痛苦!

以上是关于由于窗口问题,Kivy 应用程序在使用 pyinstaller 打包后崩溃的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Kivy 获取窗口或文本提供程序

在 KIVY 中运行程序时如何更改窗口上的图标

固定 Kivy 程序的窗口大小

如何隐藏主窗口标题栏并在 kivy 框架中放置透明背景?

使用 KIVY 集体卡在加载窗口

Kivy:弹出窗口不显示