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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:57:32