KivyMD获取MDTextField值报'super' object无__getattr__属性错误求解
报错原因
- 你代码里的
self.screen是KV根节点ScreenManager的实例,它的ids字典仅存储直接在ScreenManager规则下定义的子组件id,你要获取的user_id是在<LoginScreen>的规则内定义的,根本不在ScreenManager的ids范围内,所以首先会触发KeyError: 'user_id',后续调用属性时就会抛出你看到的AttributeError。 - Kivy的id作用域是绑定在定义id的KV规则对应的根组件上的,同个规则内的所有id不管嵌套多少层,都会统一存在该规则根组件的ids字典里,不会向上传递到父级组件的ids中。
解决方案
下面给出两种常用的可行方案,任选一种即可:
方案1:按层级获取LoginScreen实例再读取id
修改login_fun方法,先从ScreenManager中获取LoginScreen实例,再从它的ids中读取输入框内容:
def login_fun(self): # get_screen通过screen的name属性获取对应实例 login_screen = self.screen.get_screen('login') value = login_screen.ids.user_id.text print("What you typed is: ", value)
方案2:KV中直接传参(更简洁)
直接修改KV里按钮的触发逻辑,把输入框文本作为参数传给login_fun,不需要手动查找id:
首先修改KV中按钮的on_press属性:
MDFillRoundFlatButton: text:'Login' size_hint_x:0.4 font_size:17 pos_hint:{'center_x':0.5, 'center_y':0.3} on_press: app.login_fun(user_id.text)
再修改Python中的login_fun方法接收参数:
def login_fun(self, value): print("What you typed is: ", value)
可选优化
你定义的LoginScreen本身已经继承自Screen类,KV规则里不需要再嵌套一层无用的Screen组件,直接写BoxLayout作为根布局即可,减少不必要的层级嵌套。
内容的提问来源于stack exchange,提问作者Shourov
相关产品推荐
相关产品推荐

