Kivy跨类调用类方法时报ObjectProperty无text属性错误如何解决
Kivy开发ObjectProperty无text属性报错解决方案
错误根因
- 你给
MenuScreen的get_data方法加了@classmethod装饰器,此时方法内的self指向MenuScreen类本身,而非程序运行时实际创建的MenuScreen页面实例。 - 类层面定义的
menuName、menuBalance只是ObjectProperty的声明,只有实例化后的页面对象,才会根据kv配置完成和对应控件的绑定,直接访问类属性自然不存在text属性。 - 代码中手动创建的
sm = ScreenManager()及后续添加页面的代码完全冗余,和Builder加载的kv中自带的ScreenManager是两个完全独立的实例,没有任何关联。
解决步骤
1. 修改LoginScreen的show_data方法
不要直接调用MenuScreen类的方法,通过ScreenManager获取已创建的MenuScreen实例操作:
class LoginScreen(Screen): username = ObjectProperty(None) password = ObjectProperty(None) def show_data(self, obj): client.send(pickle.dumps(['login', self.username.text, self.password.text])) recv_data = pickle.loads(client.recv(1024)) # 获取实际运行的MenuScreen实例 menu_screen = self.manager.get_screen('menu') menu_screen.data = recv_data menu_screen.get_data()
2. 移除MenuScreen.get_data的类方法装饰器
改为普通的实例方法:
class MenuScreen(Screen): data = '_' menuName = ObjectProperty(None) menuBalance = ObjectProperty(None) # 删掉@classmethod装饰器 def get_data(self): self.menuName.text = self.data[0][0] self.menuBalance.text = self.data[0][1]
3. 删除冗余代码
删除以下完全无用的ScreenManager创建代码:
# 直接删除这三行 sm = ScreenManager() sm.add_widget(LoginScreen(name='login')) sm.add_widget(MenuScreen(name='menu'))
原理说明
Kivy的各类Property属性均为实例级绑定,只有页面完成实例化、kv规则生效后,ObjectProperty才会指向实际的UI控件对象,直接操作类属性无法获取到绑定的控件,因此会触发属性不存在的报错。
内容的提问来源于stack exchange,提问作者Falah
相关产品推荐
相关产品推荐

