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()
关键修正点说明
- 新增Screen子类:将
AdminloginPage继承自Screen,确保它能被ScreenManager识别和管理。 - 构建合法的根部件:在
build方法中创建ScreenManager,添加目标页面并返回,这样可以通过self.root获取屏幕管理器实例。 - 修正id写法:去掉KV中id值的引号,Kivy中id是标识符,不需要引号包裹。
- 调整方法缩进:确保
check_admin是NewApp类的成员方法,能被app.check_admin()正确调用。 - 正确获取屏幕:通过
self.root.get_screen()从屏幕管理器中获取目标页面,再读取输入框内容。
内容的提问来源于stack exchange,提问作者Khushee Dhanuka
相关产品推荐
相关产品推荐

