python - Python Kivy 不会使用 SDL2,坚持使用 pygame
问题描述
我很难让Kivy (1.11.0)在Ubuntu 18.04桌面上使用SDL2 。它一直要求很高,但已被弃用,我不想将它用于新项目。pygame
在一个全新的Ubuntu 18.04 VM上,这就是我所做的:
~ $ sudo apt install libsdl2-dev libsdl2-image-dev mesa-common-dev python3-pip python3-venv
~ $ pip3 install --user poetry
~ $ poetry new kivytest
~ $ cd kivytest
~/kivytest $ poetry add kivy pillow
Creating virtualenv kivytest-sUhjZQq9-py3.6 in ~/.cache/pypoetry/virtualenvs
Using version ^1.11.1 for kivy
Using version ^7.0.0 for pillow
Updating dependencies
Resolving dependencies... (2.2s)
Writing lock file
Package operations: 20 installs, 0 updates, 0 removals
- Installing certifi (2019.11.28)
- [...]
- Installing pillow (7.0.0)
- Installing kivy (1.11.1)
kivy
安装后,我创建了一个简单的文件test.py
:
from kivy.app import App
from kivy.uix.button import Button
class TestApp(App):
def build(self):
return Button(text='Hello World')
TestApp().run()
但是,当我运行它时,它失败了:
~/kivytest $ export KIVY_GL_BACKEND="sdl2"
~/kivytest $ poetry run python3 ./test.py
[INFO ] [Logger ] Record log in ~/.kivy/logs/kivy_20-03-29_6.txt
[INFO ] [Kivy ] v1.11.1
[INFO ] [Kivy ] Installed at "~/.cache/pypoetry/virtualenvs/kivytest-sUhjZQq9-py3.6/lib/python3.6/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.6.9 (default, Nov 7 2019, 10:44:02)
[GCC 8.3.0]
[INFO ] [Python ] Interpreter at "~/.cache/pypoetry/virtualenvs/kivytest-sUhjZQq9-py3.6/bin/python3"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_pil, img_gif (img_pygame, img_ffpyplayer ignored)
[INFO ] [Text ] Provider: pil(['text_pygame'] ignored)
[CRITICAL] [Window ] Unable to find any valuable Window provider. Please enable debug logging (e.g. add -d if running from the command line, or change the log level in the config) and re-run your app to identify potential causes
egl_rpi - ImportError: cannot import name 'bcm'
File "~/.cache/pypoetry/virtualenvs/kivytest-sUhjZQq9-py3.6/lib/python3.6/site-packages/kivy/core/__init__.py", line 63, in core_select_lib
fromlist=[modulename], level=0)
File ".../kivy/core/window/window_egl_rpi.py", line 12, in <module>
from kivy.lib.vidcore_lite import bcm, egl
pygame - ModuleNotFoundError: No module named 'pygame'
File ".../kivy/core/__init__.py", line 63, in core_select_lib
fromlist=[modulename], level=0)
File ".../kivy/core/window/window_pygame.py", line 13, in <module>
import pygame
x11 - ModuleNotFoundError: No module named 'kivy.core.window.window_x11'
File ".../kivy/core/__init__.py", line 63, in core_select_lib
fromlist=[modulename], level=0)
[CRITICAL] [App ] Unable to get a Window, abort.
如何强制它使用 SDL2?我已经安装了系统 SDL2 库,安装kivy
之后等等。
这不是关于Windows或Mac OS-X的类似问题的重复,因为我在 Ubuntu 上运行它并且解决方案不适用。
谢谢!
解决方案
好的,我找到了原因——需要更多的 SDL2 库才能kivy
使用 SDL2 支持进行构建。这有效:
~ $ sudo apt install mesa-common-dev \
libsdl2-dev libsdl2-image-dev \
libsdl2-ttf-dev libsdl2-mixer-dev
然后删除并重新安装kivy
以使用 SDL2 支持重建它:
~/testkivy $ poetry remove kivy && poetry add kivy
或者pip
如果你不使用poetry
:
(testkivy-venv) ~ $ pip uninstall kivy && pip install --user kivy
然后它工作:
$ ./test.py
...
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
[INFO ] [Text ] Provider: sdl2(['text_pango'] ignored)
[INFO ] [Window ] Provider: sdl2(['window_egl_rpi'] ignored)
[INFO ] [GL ] Using the "OpenGL" graphics system
[INFO ] [GL ] Backend used <sdl2> <<<< YAY!!!
[INFO ] [GL ] OpenGL version <b'3.0 Mesa 19.2.8'>
[INFO ] [GL ] OpenGL vendor <b'Intel Open Source Technology Center'>
[INFO ] [GL ] OpenGL renderer <b'Mesa DRI Intel(R) HD Graphics 520 (Skylake GT2) '>
[INFO ] [GL ] OpenGL parsed version: 3, 0
[INFO ] [GL ] Shading version <b'1.30'>
[INFO ] [GL ] Texture max size <16384>
[INFO ] [GL ] Texture max units <32>
[INFO ] [Window ] auto add sdl2 input provider
...
推荐阅读
- javascript - 加载页面时自动打开输入文件对话框
- python - 如何使用 pyspark 读取包含多行的 .sql 文件?
- python - 带代理的 Selenium 返回空网站
- c# - 将所有活动从一条记录移动到另一条记录,SSIS 还是 C#?
- postgresql - 如何在 Go API 中同时运行函数而不是顺序运行?
- html - 如何分隔 HTML 列表中的项目,使其在水平导航中就像三个元素在一侧,两个在另一侧
- dpdk - 从源代码交叉编译 DPDK
- laravel - Laravel Cashier Single Charge 是否适合这个任务
- java - java.util.Properties.load() 问题 OWASP Top 10 2017
- oracle - 如何禁用过期密码时间并锁定Oracle数据库