You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:27:01