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

KivyMD安卓APK崩溃:material_resources.py报NoneType属性错误

KivyMD安卓打包APK时出现AttributeError: 'NoneType' object has no attribute 'width'错误

问题详情

  • 开发的安卓KivyMD应用在Windows系统中直接运行.py文件完全正常
  • 通过Windows子系统Ubuntu使用Buildozer打包APK时,触发以下错误:
/mnt/c/Users/Ayan/Documents/rackcalculator/.buildozer/android/build-arm64-v8a_armeabi-v7a/build/python-installs/rackcalculator/arm64-v8a/kivymd/material_resources.py, line 20, in <module>

AttributeError: 'NoneType' object has no attribute 'width'
  • 错误源自Buildozer自动安装的KivyMD库,涉及代码为from kivy.core.window import Window并调用Window.width和Window.height
  • 手动修改material_resources.py后重新编译,Buildozer构建仍报错;清理构建缓存后,系统会重新下载存在问题的原版KivyMD文件

解决方法

1. 延迟Window属性的调用

安卓环境下Kivy的Window对象初始化晚于模块加载时机,直接在模块级别访问Window.width/Window.height会导致对象为None。修改material_resources.py中的相关代码,将Window属性的调用移到应用初始化完成后:

  • 比如将代码放到App类的on_start方法中
  • 或者用Clock.schedule_once延迟执行,示例:
from kivy.clock import Clock

def get_window_size(dt):
    global WINDOW_WIDTH, WINDOW_HEIGHT
    WINDOW_WIDTH = Window.width
    WINDOW_HEIGHT = Window.height

Clock.schedule_once(get_window_size)

2. 指定Buildozer使用自定义修改后的KivyMD

避免每次构建被覆盖,不要直接修改build目录下的文件,而是:

  • 克隆KivyMD源码到本地,修改其中的material_resources.py文件
  • 在buildozer.spec的requirements项中,替换官方KivyMD为你的自定义版本:
    • 使用Git仓库:requirements = kivy, git+https://github.com/你的用户名/kivymd.git
    • 使用本地路径:requirements = kivy, git+file:///home/你的用户名/kivymd

3. 切换到修复该问题的KivyMD版本

如果是版本bug,直接指定已修复的KivyMD稳定版本,在buildozer.spec中修改:

requirements = kivy, kivymd==1.1.1  # 替换为实际修复该问题的版本号

内容的提问来源于stack exchange,提问作者AaYan Yasin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:34:52