Kivy 2.3.0及开发版窗口调整时组件消失问题求助
Kivy/KivyMD窗口调整大小后组件消失问题(Windows 11 + Python 3.12)
问题描述
在Kivy 2.3.0稳定版及Kivy 3.0.1dev、KivyMD 2.0.0dev开发版中,调整应用窗口大小后,所有UI组件会突然消失,仅留空白窗口(窗口仍可移动、调整大小)。即使是仅含单个Label的Hello World程序也会触发该问题,日志显示SDL2窗口的DPI回调函数出现访问违规:
Exception ignored on calling ctypes callback function: <bound method _WindowsSysDPIWatch._wnd_proc of <kivy.core.window.window_sdl2._WindowsSysDPIWatch object at 0x00000290FB4F2F90>> Traceback (most recent call last): File "d:\Learning\Projects\Kivy\Udemy\hello_kivymd\venv\Lib\site-packages\kivy\core\window\window_sdl2.py", line 998, in _wnd_proc return windll.user32.CallWindowProcW( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ OSError: exception: access violation reading 0x000002909F58E3A8
已完成的排查:
- 尝试过Poetry、pip虚拟环境安装稳定版/开发版Kivy/KivyMD
- 确认Windows 11、Python 3.12、显卡驱动均为最新
- 未使用Anaconda/Miniconda,未找到项目内的
config.ini
解决方案/排查思路
1. 强制固定DPI值,禁用自动DPI感知
在代码开头添加配置,绕过Kivy的动态DPI处理:
from kivy.config import Config # 固定DPI为96(系统默认值) Config.set('graphics', 'dpi', '96') Config.write()
或者手动创建config.ini文件(放在项目根目录或%APPDATA%\kivy\路径下),写入:
[graphics] dpi = 96
2. 降级Python版本至3.11.x
Python 3.12的ctypes实现或底层API变更可能导致Kivy的SDL2窗口回调出现兼容性问题,降级到Python 3.11后重新安装Kivy 2.2.1稳定版(兼容性更成熟):
# 创建3.11虚拟环境 python -m venv kivy_venv --python=python3.11 # 激活环境后安装 pip install kivy[base]==2.2.1 kivymd==1.1.1
3. 临时修补SDL2窗口回调函数
找到虚拟环境中的kivy/core/window/window_sdl2.py,定位到_WindowsSysDPIWatch类的_wnd_proc方法,添加异常捕获避免崩溃:
def _wnd_proc(self, hwnd, msg, wparam, lparam): try: return windll.user32.CallWindowProcW( self.old_wnd_proc, hwnd, msg, wparam, lparam ) except OSError: return 0
注意:此补丁会在Kivy更新后被覆盖,仅作临时应急使用。
4. 切换至GDI渲染后端
强制Kivy使用GDI而非OpenGL渲染,规避DPI相关的OpenGL冲突:
from kivy.config import Config Config.set('graphics', 'backend', 'gdi') Config.write()
内容的提问来源于stack exchange,提问作者aekarahan
相关产品推荐
相关产品推荐

