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
- 使用Git仓库:
3. 切换到修复该问题的KivyMD版本
如果是版本bug,直接指定已修复的KivyMD稳定版本,在buildozer.spec中修改:
requirements = kivy, kivymd==1.1.1 # 替换为实际修复该问题的版本号
内容的提问来源于stack exchange,提问作者AaYan Yasin
相关产品推荐
相关产品推荐

