无法获取窗口,中止程序。

33

运行Kivy的hello world程序时,我遇到了一个常见的错误。我尝试了我在这里看到的解决方案:手动安装 gstreamer,将其添加到 PATH 并安装 PySDL2。我的操作系统是Windows 7,所有其他版本信息都在错误日志中。

# you need this two lines:
import os
os.environ['KIVY_IMAGE'] = 'pil,sdl2'

#kivy program
from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
    def build(self):
        return Button(text='Hello World')

TestApp().run()

错误日志:

[INFO              ] [Logger      ] Record log in C:\Users\xyz\.kivy\logs\kivy_16-11-19_11.txt
[INFO              ] [Kivy        ] v1.9.1
[INFO              ] [Python      ] v2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)]
[INFO              ] [Factory     ] 179 symbols loaded
[INFO              ] [Image       ] Providers: img_pil, img_sdl2 (img_tex, img_dds, img_ffpyplayer, img_gif ignored)
[INFO              ] [Text        ] Provider: sdl2
[INFO              ] [OSC         ] using <thread> for socket
[INFO              ] [Window      ] Provider: sdl2
[INFO              ] [GL          ] GLEW initialization succeeded
[INFO              ] [GL          ] OpenGL version <3.1.0 - Build 8.15.10.2538>
[INFO              ] [GL          ] OpenGL vendor <Intel>
[INFO              ] [GL          ] OpenGL renderer <Intel(R) HD Graphics Family>
[INFO              ] [GL          ] OpenGL parsed version: 3, 1
[INFO              ] [GL          ] Shading version <1.40  - Intel Build 8.15.10.2538>
[INFO              ] [GL          ] Texture max size <8192>
[INFO              ] [GL          ] Texture max units <16>
[INFO              ] [Shader      ] fragment shader: <No errors.>
[INFO              ] [Shader      ] vertex shader: <No errors.>
[INFO              ] [Shader      ] program: <No errors.>
[CRITICAL          ] [Window      ] Unable to find any valuable Window provider at all!
sdl2 - AttributeError: tobytes
  File "C:\Program Files\python27\lib\site-packages\kivy\core\__init__.py", line 67, in core_select_lib
    cls = cls()
  File "C:\Program Files\python27\lib\site-packages\kivy\core\window\window_sdl2.py", line 138, in __init__
    super(WindowSDL, self).__init__()
  File "C:\Program Files\python27\lib\site-packages\kivy\core\window\__init__.py", line 722, in __init__
    self.create_window()
  File "C:\Program Files\python27\lib\site-packages\kivy\core\window\window_sdl2.py", line 255, in create_window
    super(WindowSDL, self).create_window()
  File "C:\Program Files\python27\lib\site-packages\kivy\core\window\__init__.py", line 897, in create_window
    self.render_context = RenderContext()
  File "kivy\graphics\instructions.pyx", line 756, in kivy.graphics.instructions.RenderContext.__init__ (kivy\graphics\instructions.c:10729)
  File "C:\Program Files\python27\lib\site-packages\kivy\core\image\__init__.py", line 512, in __init__
    self.filename = arg
  File "C:\Program Files\python27\lib\site-packages\kivy\core\image\__init__.py", line 700, in _set_filename
    mipmap=self._mipmap, nocache=self._nocache)
  File "C:\Program Files\python27\lib\site-packages\kivy\core\image\__init__.py", line 430, in load
    im = loader(filename, **kwargs)
  File "C:\Program Files\python27\lib\site-packages\kivy\core\image\__init__.py", line 198, in __init__
    self._data = self.load(filename)
  File "C:\Program Files\python27\lib\site-packages\kivy\core\image\img_pil.py", line 101, in load
    return list(self._img_read(im))
  File "C:\Program Files\python27\lib\site-packages\kivy\core\image\img_pil.py", line 86, in _img_read
    img_tmp.mode.lower(), img_tmp.tobytes())
  File "C:\Program Files\python27\lib\site-packages\PIL\Image.py", line 514, in __getattr__
    raise AttributeError(name)

[CRITICAL          ] [App         ] Unable to get a Window, abort.
 Exception SystemExit: 1 in 'kivy.properties.dpi2px' ignored
[CRITICAL          ] [App         ] Unable to get a Window, abort.

你是如何安装Kivy的? - inclement
如https://kivy.org/docs/installation/installation-windows.html#installation中所示,除了我下载了GStreamer并从本地副本安装。 - foosion
7个回答

55

在命令提示符中进入python34,然后进入Scripts并安装以下内容:

pip install --upgrade pip wheel setuptools
pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew
pip install kivy.deps.gstreamer
pip install kivy.deps.angle
pip install kivy

1
对于像我一样遇到这个问题的人:pip install pypiwin32 可能会出现错误,因为 pywin32 可能已经安装并且无法卸载。对于我来说,当我通过单独的 pip install 运行第二行中的项目并忽略 pypiwin32 安装错误时,它起作用了。 - Joris
1
FYI,对于其他版本的Python似乎也适用的这个好答案。在Python 3.7.3中表现良好。 - Hzzkygcs
在Windows 10和Python 3.8.6上,按照此帖子中所述安装Kivy对我没有起作用。 - user171780
@user171780 你应该将你的Python降级到3.7版本。PyInstaller与3.8版本不兼容,无法正常工作。 - Elessar

10
尝试将<python dir>\share\sdl2\bin加入您的路径,这应该能解决问题。问题在于它找不到与之配套的sdl2二进制文件。可能甚至没有PIL窗口提供者,因此使用环境变量无法创建窗口(但可以用作图像提供者)。
我不太熟悉PySDL2,所以无法为您提供帮助,但是我为Windows上的Kivy制作了一个安装程序,以使初学者更容易上手。
基本上有两种方法会让您最终达成目标:
1. 您会永久性地将bin文件夹添加到PATH变量中。
我认为这非常愚蠢,除非您确定不会删除Python或该文件夹,否则您将在PATH中留下一个幽灵文件夹,并且所有其他程序都将通过PATH访问bin文件夹中的文件。
2. 您将拥有一个批处理文件,临时执行该操作。
只有从控制台/批处理运行的程序才能访问bin文件夹。
安装程序可以为您执行这些操作,甚至可以从头开始安装(没有Python)或执行许多其他操作。
如果您尚未安装Kivy依赖项,请先进行安装。

1
我会尝试并回报。我不再认为我需要PySDL2,因为kivy.deps.sdl2是一个依赖项。 - foosion
如果您正在使用Anaconda C:\Users[USER NAME]\Anaconda2\share\gstreamer\bin。 - lit

5

不确定 Windows 或 Linux,但在 python-for-android 的顶部,您需要放置:

#qpy:kivy
import kivy
kivy.require('1.10.1') # replace with your current kivy version !

第一行:#qpy:kivy 第二行:导入kivy 第三行:kivy.require('1.10.0'),对我来说,只需pip install kivy即可自动完成所有所需的升级。这就是qpython的荣耀。 - Robert Holmes

3
我刚找到了一种快速解决方法
  1. 在使用 pip 安装 Kivy 后
  2. 导航到 C:\Users\(账户名)\.kivy\ 并打开 config.ini 文件
  3. multisamples = 0 的值从 = 2 更改为 = 0,然后重新启动您的计算机。这样还可以解决其他问题

[CRITICAL] [GL ] Minimum required OpenGL version (2.0) NOT found!

在 windows 7 64 位,python3.5(32 位) 和 Kivy 版本 1.10.0 上有效。


3

我通过pip安装pygame使其工作。

pip3 install pygame ,然后它就可以运行了。

这样,我不必在我的VM中禁用3D加速。


3

在虚拟软件(例如vmbox、vmware)的显示设置中禁用3D加速和2D视频加速。我认为这对你有用,经过多次尝试,它对我有效。


1
我也通过从pip安装pygame使其正常工作。 pip3 install pygame,然后它就可以工作了,我不必在我的虚拟机中禁用3D加速。 - james-see
1
@jamescampbell 安装pygame解决了我的问题,你可以创建一个答案(而不仅仅是一个评论,因为它是可行的解决方案之一)。 - Tim
@Tim 好主意。现在正在执行。 - james-see

3
我正在使用Windows 10和Python 3.6,并使用pip安装了Kivy。 以上解决方案都没有帮助,但是我使用pip卸载了Kivy,然后根据https://kivy.org/doc/stable/installation/installation-windows.html#installation的指南,使用conda重新安装了Kivy,并且成功了。
conda为我安装了以下包: 下列软件包将会被下载:
package                    |            build
---------------------------|-----------------
freetype-2.8.1             |           vc14_0         469 KB  conda-forge
sdl2_mixer-2.0.4           |       h6538335_0          83 KB  conda-forge
sdl2-2.0.10                |       h6538335_0         4.3 MB  conda-forge
kivy-1.11.1                |   py36hbc14df2_0        20.2 MB  conda-forge
sdl2_image-2.0.2           |                0         293 KB  conda-forge
glew-2.0.0                 |    he025d50_1002         722 KB  conda-forge
sdl2_ttf-2.0.14            |       h8909db8_1          25 KB  conda-forge
smpeg2-2.0.0               |       h6538335_1         131 KB  conda-forge
------------------------------------------------------------

是的,太感谢了!这就是我的问题! :) - Marc Vana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接