Kivy应用在Android 13启动后崩溃(Google Colab构建)
问题:KivyMD应用在Android 13启动崩溃,PC端运行正常
报错信息
Traceback (most recent call last): File "kivy/properties.pyx", line 961, in kivy.properties.ObservableDict.__getattr__ KeyError: '_left_container' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/content/.buildozer/android/app/main.py", line 98, in <module> File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/app.py", line 955, in run File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/app.py", line 925, in _run_prepare File "/content/.buildozer/android/app/main.py", line 75, in build File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/lang/builder.py", line 407, in load_string File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/lang/builder.py", line 662, in _apply_rule File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/lang/builder.py", line 662, in _apply_rule File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/lang/builder.py", line 660, in _apply_rule File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/uix/widget.py", line 470, in apply_class_lang_rules File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/lang/builder.py", line 540, in apply File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivy/lang/builder.py", line 659, in _apply_rule File "/content/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/myapp/arm64-v8a/kivymd/uix/list/list.py", line 1206, in add_widget File "kivy/properties.pyx", line 964, in kivy.properties.ObservableDict.__getattr__ AttributeError: 'super' object has no attribute '__getattr__'. Did you mean: '__setattr__'? Python for android ended.
相关代码
main.py
import requests import json from kivy.lang import Builder from kivymd.app import MDApp from kivymd.toast import toast KV = """ <CB@TwoLineAvatarIconListItem>: IconLeftWidget: id: i1 icon: "pencil" IconRightWidget: icon: "pencil" #this is a transparent png image of 188 bytes MDCheckbox: id: x54 on_active: app.save_checked(*args,root.text,root.secondary_text,root.ids.i1.icon,root) BoxLayout: size_hint:[.8, .9] ScrollView: MDList: id: scroll CB: text: "box" secondary_text: "1" icon: "pencil" CB: text: "garbage" secondary_text: "2" icon: "pencil" CB: text: "car" secondary_text: "3" icon: "pencil" MDRaisedButton: id: cm text: "Save" on_release: app.send() """ class MainApp(MDApp): def __init__(self, **kwargs): super().__init__(**kwargs) self.data = [] def build(self): return Builder.load_string(KV) def save_checked(self, checkbox, value, a, b, c, w): # a - text # b - secondary_text # value - state(True/False) on and off # c - icon # checkbox and w idk, just kivy args if value: print(checkbox, value, a, b, c, w) self.data.append(b) else: self.data.remove(b) def send(self): #send data with requests pass MainApp().run()
buildozer.spec
requirements = python3,kivy==2.2.0,kivymd,urllib3, requests, chardet, certifi, idna, osx.python_version = 3 osx.kivy_version = 1.9.1 android.permissions = android.permission.INTERNET android.api = 33 android.minapi = 21
解决方案
1. 统一Kivy与KivyMD版本,解决兼容性问题
PC端使用Kivy 2.1.0,安卓构建时指定2.2.0,版本差异导致控件结构不兼容。修改buildozer.spec的依赖配置,统一版本并确保KivyMD与Kivy兼容:
requirements = python3,kivy==2.1.0,kivymd==1.1.1,requests android.permissions = android.permission.INTERNET android.api = 33 android.minapi = 21
(移除多余的依赖项,requests会自动拉取所需的依赖库)
2. 修正Kv语言中列表项的控件结构
TwoLineAvatarIconListItem内置了左右容器,直接添加IconLeftWidget/IconRightWidget作为子部件会触发容器查找错误。改为通过left_widget和right_widget属性指定部件,同时移除不必要的IconRightWidget嵌套:
<CB@TwoLineAvatarIconListItem>: left_widget: IconLeftWidget(icon=root.icon) right_widget: MDCheckbox( id: x54 on_active: app.save_checked(*args, root.text, root.secondary_text, root.icon, root) ) BoxLayout: size_hint: .8, .9 ScrollView: MDList: id: scroll CB: text: "box" secondary_text: "1" icon: "pencil" CB: text: "garbage" secondary_text: "2" icon: "pencil" CB: text: "car" secondary_text: "3" icon: "pencil" MDRaisedButton: id: cm text: "Save" on_release: app.send()
3. 修复数据操作的潜在异常
原代码中self.data.remove(b)会在元素不存在时抛出错误,添加存在性判断:
def save_checked(self, checkbox, value, a, b, c, w): if value: if b not in self.data: self.data.append(b) else: if b in self.data: self.data.remove(b)
4. 重新构建APK
在Google Colab中重新执行Buildozer构建命令,确保依赖安装正确后生成新的APK安装包。
内容的提问来源于stack exchange,提问作者ASD
相关产品推荐
相关产品推荐

