You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派3+PiTFT 3.5屏运行Kivy项目报错:无法找到可用窗口提供者

Kivy在树莓派3+Adafruit PiTFT 3.5寸屏上无法找到Window Provider的问题解决

问题描述

我正在开发一个学校Python项目,使用Kivy为Naomi游戏制作图形界面,目标是集成树莓派3和Adafruit PiTFT 3.5寸屏幕。项目在PC上运行完全正常,但在树莓派上执行时出现错误,核心报错为[CRITICAL] [Window] Unable to find any valuable Window provider。

完整错误日志

pi@raspberrypi:/opt/kivydimmboot $ python3.9 main.py -d                                                                   [INFO   ] [Logger      ] Record log in /home/pi/.kivy/logs/kivy_23-03-08_8.txt
[INFO   ] [Kivy        ] v2.1.0
[INFO   ] [Kivy        ] Installed at "/usr/local/lib/python3.9/site-packages/kivy/__init__.py"
[INFO   ] [Python      ] v3.9.0 (default, Mar  8 2023, 00:35:33)
[GCC 8.3.0]
[INFO   ] [Python      ] Interpreter at "/usr/local/bin/python3.9"
[INFO   ] [Logger      ] Purge log fired. Processing...
[INFO   ] [Logger      ] Purge finished!
[INFO   ] [Factory     ] 189 symbols loaded
[DEBUG  ] [Cache       ] register <kv.resourcefind> with limit=None, timeout=60
[DEBUG  ] [Cache       ] register <kv.lang> with limit=None, timeout=None
[DEBUG  ] [Cache       ] register <kv.image> with limit=None, timeout=60
[DEBUG  ] [Cache       ] register <kv.atlas> with limit=None, timeout=None
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil (img_ffpyplayer ignored)
[DEBUG  ] [Cache       ] register <kv.texture> with limit=1000, timeout=60
[DEBUG  ] [Cache       ] register <kv.shader> with limit=1000, timeout=3600
[DEBUG  ] [Window      ] Ignored <egl_rpi> (import error)
[INFO   ] [Window      ] Provider: sdl2(['window_egl_rpi'] ignored)
[DEBUG  ] [Window      ] Ignored <x11> (import error)
[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' from 'kivy.lib.vidcore_lite' (/usr/local/lib/python3.9/site-packages/kivy/lib/vidcore_lite/__init__.py)
  File "/usr/local/lib/python3.9/site-packages/kivy/core/__init__.py", line 59, in core_select_lib
    mod = importlib.__import__(name='{2}.{0}.{1}'.format(
  File "<frozen importlib._bootstrap>", line 1109, in __import__
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 790, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/usr/local/lib/python3.9/site-packages/kivy/core/window/window_egl_rpi.py", line 12, in <module>
    from kivy.lib.vidcore_lite import bcm, egl

sdl2 - RuntimeError: b''
  File "/usr/local/lib/python3.9/site-packages/kivy/core/__init__.py", line 71, in core_select_lib
    cls = cls()
  File "/usr/local/lib/python3.9/site-packages/kivy/core/window/window_sdl2.py", line 165, in __init__
    super(WindowSDL, self).__init__()
  File "/usr/local/lib/python3.9/site-packages/kivy/core/window/__init__.py", line 1071, in __init__
    self.create_window()
  File "/usr/local/lib/python3.9/site-packages/kivy/core/window/window_sdl2.py", line 306, in create_window
    self.system_size = _size = self._win.setup_window(
  File "kivy/core/window/_window_sdl2.pyx", line 114, in kivy.core.window._window_sdl2._WindowSDL2Storage.setup_window
  File "kivy/core/window/_window_sdl2.pyx", line 76, in kivy.core.window._window_sdl2._WindowSDL2Storage.die

x11 - ModuleNotFoundError: No module named 'kivy.core.window.window_x11'
  File "/usr/local/lib/python3.9/site-packages/kivy/core/__init__.py", line 59, in core_select_lib
    mod = importlib.__import__(name='{2}.{0}.{1}'.format(
  File "<frozen importlib._bootstrap>", line 1109, in __import__
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked

[DEBUG  ] [Text        ] Provider <pango> ignored by config
[INFO   ] [Text        ] Provider: sdl2(['text_pango'] ignored)
[INFO   ] [KivyMD      ] 1.1.1, git-Unknown, 2022-10-13 (installed at "/home/pi/.local/lib/python3.9/site-packages/kivymd/__init__.py")
[CRITICAL] [App         ] Unable to get a Window, abort.

已尝试的无效配置

在main.py开头添加了以下环境变量,但问题未解决:

# Setup touchscreen
os.environ['SDL_VIDEODRIVER']= 'fbcon'
os.environ['SDL_FBDEV']= '/dev/fb1'
os.environ['SDL_MOUSEDRV'] = 'TSLIB'
os.environ["SDL_MOUSEDEV"] = '/dev/input/touchscreen'

# for raspberry
os.environ['KIVY_WINDOW'] = 'egl_rpi'
os.environ['KIVY_GL_BACKEND'] = 'gl'

解决方案

1. 修复Kivy依赖缺失问题

日志显示egl_rpi无法导入bcm,这是因为Kivy 2.1.0在树莓派上的vidcore_lite模块兼容性问题,重新安装适配树莓派的完整依赖:

sudo apt-get update && sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
sudo pip3 install kivy[full] --no-binary kivy

2. 调整环境变量配置

切换窗口提供者为sdl2,并完善SDL指向PiTFT的配置,修改main.py开头的环境变量:

import os

# 优先使用SDL2作为窗口提供者
os.environ['KIVY_WINDOW'] = 'sdl2'
# 配置SDL指向PiTFT屏幕
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
os.environ['SDL_FBDEV'] = '/dev/fb1'
os.environ['SDL_MOUSEDRV'] = 'TSLIB'
os.environ['SDL_MOUSEDEV'] = '/dev/input/touchscreen'
# 禁用X11避免干扰
os.environ['DISPLAY'] = ''

3. 验证触摸屏输入配置

确保TSLIB已正确安装并识别触摸屏:

sudo apt-get install tslib libts-bin
# 测试触摸屏输入,若有触摸反馈则配置正常
ts_test

如果ts_test无反应,需检查/dev/input/touchscreen路径是否正确,可通过查看/dev/input/下的设备列表确认,必要时重新配置PiTFT驱动。

4. 检查树莓派系统配置

编辑/boot/config.txt,确保启用PiTFT所需的硬件设置:

dtparam=spi=on
dtparam=i2c_arm=on
dtoverlay=pitft35-resistive,rotate=0,speed=64000000,fps=20

修改后重启树莓派生效。

5. 降级Kivy版本(可选)

若以上方法无效,可尝试降级到对树莓派兼容性更好的Kivy 2.0.0:

pip3 uninstall kivy
pip3 install kivy==2.0.0

内容的提问来源于stack exchange,提问作者Mehdi Dounas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:25:03