Kivy切换屏幕时报错ObjectProperty无manager1属性该如何解决?
问题解决方法
错误原因
你触发报错的核心原因有3个:
- 定义在
My2App类中的ObjectProperty是实例属性,你直接用类名My2App访问拿到的是属性定义本身,不是运行时绑定的实例对象,自然不存在manager1属性 - kv文件的属性绑定逻辑写反,没有把kv中定义的id控件绑定到App实例的对应属性上
- 切换屏幕不需要绕App获取ScreenManager,Screen组件自带
manager属性可以直接获取父级ScreenManager实例
修正步骤
1. 修正kv文件绑定逻辑
删除多余的自绑定属性,保留id即可:
ScreenManager: id:manager1 First_Screen: id:first Show_Title: id:second <First_Screen>: name:'start' # 其余内容.....
2. 修正App类的属性绑定
在kv加载完成后手动把id对应的实例赋值给App的ObjectProperty:
class My2App(MDApp): manager1 = ObjectProperty(None) first = ObjectProperty(None) second = ObjectProperty(None) def build(self): self.bd = Builder.load_file("My.kv") # 绑定kv内控件到App属性 self.manager1 = self.bd.ids.manager1 self.first = self.bd.ids.first self.second = self.bd.ids.second return self.bd
3. 修正切换屏幕的代码
如果是在First_Screen类内部写切换逻辑,推荐直接用自带的manager属性,写法最简单:
# First_Screen类内的代码 self.manager.current = "start"
如果需要通过App实例访问,要先获取当前运行的App实例,不能直接用类名访问:
from kivymd.app import MDApp # First_Screen类内的代码 app = MDApp.get_running_app() app.manager1.current = "start"
内容的提问来源于stack exchange,提问作者sam prgrammer
相关产品推荐
相关产品推荐

