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

Python3.10.7+KivyMD中'super'对象无__getattr__属性错误排查

问题分析与解决

错误原因

你遇到的AttributeError: 'super' object has no attribute '__getattr__'是由多个代码问题共同导致的:

  • build方法使用错误:Builder.load_string()仅用于加载KV样式,不会返回可管理屏幕的容器(如ScreenManager),你调用self.strng.get_screen()时,self.strng实际是None,引发后续错误。
  • KV中id写法错误:MDTextField的id被写成id:'adminid',多余的引号会导致无法通过ids字典正确获取组件。
  • 未定义合法的Screen子类:KV中设置了name:'adminloginpage',但未在Python代码中将AdminloginPage定义为Screen的子类,无法被屏幕管理器识别。
  • 方法缩进错误:check_admin方法被定义在NewApp类外部,无法被app实例正常调用(你提到函数已被调用,大概率是粘贴时格式错误)。

修正后的完整代码

login.py

from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.app import MDApp

# 定义AdminloginPage为Screen子类,使其能被ScreenManager管理
class AdminloginPage(Screen):
    pass

class NewApp(MDApp):
    def build(self):
        self.theme_cls.theme_style = "Dark"
        self.theme_cls.primary_palette = "Blue"
        # 加载KV样式
        Builder.load_string(help_str)
        # 创建屏幕管理器并添加admin登录页
        screen_manager = ScreenManager()
        screen_manager.add_widget(AdminloginPage(name='adminloginpage'))
        # 返回屏幕管理器作为App根部件
        return screen_manager

    def check_admin(self):
        # 从屏幕管理器中获取目标页面
        admin_screen = self.root.get_screen('adminloginpage')
        # 获取输入框内容(ids键为无引号的adminid/adminpassword)
        self.admin_id = admin_screen.ids.adminid.text
        self.admin_password = admin_screen.ids.adminpassword.text
        # 可在此添加账号密码校验逻辑,比如打印测试
        print(f"Admin ID: {self.admin_id}, Password: {self.admin_password}")

# KV样式字符串
help_str='''
<AdminloginPage>:
    name:'adminloginpage'

    BoxLayout:
        orientation:'vertical'
        size: root.width, root.height
        MDLabel:
            text:"Admin screen"
            font_style:"H4"
            halign:'center'
            pos_hint:{'center_y':0.9}
            size_hint:(0.7,0.1)
        MDTextField:
            id: adminid  # 去掉多余引号
            halign:'center'
            hint_text:'enter admin id '
            icon_right:'account'
            pos_hint:{'center_x':0.5,'center_y':0.5}
            size_hint:(0.7,0.1)
            helper_text:'Required'
            helper_text_mode:'on_error'
            required:True
            multiline:False

        MDTextField:
            id: adminpassword  # 去掉多余引号
            halign:'center'
            hint_text:'enter admin password '
            icon_right:'eye-off'
            pos_hint:{'center_x':0.5,'center_y':0.5}
            size_hint:(0.7,0.1)
            helper_text:'Required'
            helper_text_mode:'on_error'
            required:True
            password:True
            multiline:False

        MDTextButton:
            text: 'submit'
            md_bg_color: app.theme_cls.primary_color
            user_font_size:'30sp'
            size_hint:(0.9,0.5)
            on_press: app.check_admin()
'''

if __name__ == "__main__":
    NewApp().run()

关键修正点说明

  1. 新增Screen子类:将AdminloginPage继承自Screen,确保它能被ScreenManager识别和管理。
  2. 构建合法的根部件:在build方法中创建ScreenManager,添加目标页面并返回,这样可以通过self.root获取屏幕管理器实例。
  3. 修正id写法:去掉KV中id值的引号,Kivy中id是标识符,不需要引号包裹。
  4. 调整方法缩进:确保check_admin是NewApp类的成员方法,能被app.check_admin()正确调用。
  5. 正确获取屏幕:通过self.root.get_screen()从屏幕管理器中获取目标页面,再读取输入框内容。

内容的提问来源于stack exchange,提问作者Khushee Dhanuka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:40:28