Kivy中'super' object has no attribute '__getattr__'错误的解决求助
解决Kivy中'super' object has no attribute 'getattr'错误并实现输入文本打印功能
问题分析
作为Kivy新手踩这个坑太正常啦!你想要实现点击Submit按钮打印输入框内容,但报错的核心原因有两个:
- 你在Python代码里写的
self.root.ids.input.text完全不对:self.root是ScreenManager,它本身没有名为input的控件;而且你的kv文件里,登录页面的输入框id是usernameinput和passwordinput,根本不是input。 - 更关键的是,
ScreenManager的ids不会包含子Screen里的控件,你得先拿到对应的Screen实例,再访问它的ids。
修复方案
修改MainApp里的returnusername和returnpassword方法,先获取当前的登录页面Screen,再读取对应输入框的文本:
def returnusername(self): # 获取LoginPageScreen实例 login_screen = self.root.get_screen("LoginPage") text = login_screen.ids.usernameinput.text print("用户名:", text) def returnpassword(self): login_screen = self.root.get_screen("LoginPage") text = login_screen.ids.passwordinput.text print("密码:", text)
完整修改后的代码
Python代码
import kivy from kivymd.app import MDApp from kivy.core.window import Window from kivy.app import Builder from kivymd.uix.screen import MDScreen from kivy.uix.screenmanager import ScreenManager, Screen class FirstPageScreen(MDScreen): pass class LoginPageScreen(MDScreen): pass class NewAccountScreen(MDScreen): pass class WindowManager(ScreenManager): pass class MainApp(MDApp): def build(self): Window.size = [300, 600] return Builder.load_file("screen.kv") def returnusername(self): login_screen = self.root.get_screen("LoginPage") text = login_screen.ids.usernameinput.text print("用户名:", text) def returnpassword(self): login_screen = self.root.get_screen("LoginPage") text = login_screen.ids.passwordinput.text print("密码:", text) MainApp().run()
Kivy代码(screen.kv)
#:kivy 2.0.0 WindowManager: FirstPageScreen: LoginPageScreen: NewAccountScreen: <FirstPageScreen>: name: "FirstPage" MDFloatLayout: MDLabel: text: "Time Saving App" halign: "center" valign: "center" font_size: 25 pos_hint: {'center_x': 0.5, 'center_y': 0.85} MDRectangleFlatButton: halign: "center" valign: "center" text: "Login" theme_text_color: "Custom" text_color: 1, 1, 1, 1 md_bg_color: 0, 0, 1, 1 line_color: 0, 0, 1, 1 pos_hint: {'center_x': 0.5, 'center_y': 0.75} on_release: app.root.current = "LoginPage" MDRectangleFlatButton: halign: "center" valign: "center" text: "Create new account" theme_text_color: "Custom" text_color: 1, 1, 1, 1 md_bg_color: 0, 0, 1, 1 line_color: 0, 0, 1, 1 pos_hint: {'center_x': 0.5, 'center_y': 0.65} on_release: app.root.current = "NewAccount" <LoginPageScreen>: name: "LoginPage" MDFloatLayout: MDLabel: text: "Login" halign: "center" valign: "center" font_size: 25 pos: (0,220) MDRectangleFlatButton: halign: "center" valign: "center" text: "Back" theme_text_color: "Custom" text_color: 1, 1, 1, 1 md_bg_color: 0, 0, 1, 1 line_color: 0, 0, 1, 1 pos_hint: {'center_x': 0.5, 'center_y': 0.3} on_release: app.root.current = "FirstPage" TextInput: id: usernameinput hint_text:'Enter your Username' pos_hint: {'center_x': 0.5, 'center_y': 0.705} size_hint: 0.8, 0.05 multiline: False TextInput: id: passwordinput hint_text:'Enter your Password' pos_hint: {'center_x': 0.5, 'center_y': 0.6} size_hint: 0.8, 0.05 multiline: False MDRectangleFlatButton: halign: "center" valign: "center" text: "Submit" theme_text_color: "Custom" text_color: 1, 1, 1, 1 md_bg_color: 0, 0, 1, 1 line_color: 0, 0, 1, 1 pos_hint: {'center_x': 0.5, 'center_y': 0.45} size_hint: 0.25, 0.05 on_release: app.returnusername() app.returnpassword() <NewAccountScreen>: name: "NewAccount" MDFloatLayout: MDLabel: text: "Create New account" halign: "center" valign: "center" font_size: 25 pos: (0,220) MDRectangleFlatButton: halign: "center" valign: "center" text: "Back" theme_text_color: "Custom" text_color: 1, 1, 1, 1 md_bg_color: 0, 0, 1, 1 line_color: 0, 0, 1, 1 pos_hint: {'center_x': 0.5, 'center_y': 0.3} size_hint: 0.25, 0.05 on_release: app.root.current = "FirstPage" TextInput: id: newusernameinput hint_text:'Enter a Username' pos_hint: {'center_x': 0.5, 'center_y': 0.705} size_hint: 0.8, 0.05 multiline: False TextInput: id: newpasswordinput hint_text:'Enter a Password' pos_hint: {'center_x': 0.5, 'center_y': 0.6} size_hint: 0.8, 0.05 multiline: False MDRectangleFlatButton: halign: "center" valign: "center" text: "Submit" theme_text_color: "Custom" text_color: 1, 1, 1, 1 md_bg_color: 0, 0, 1, 1 line_color: 0, 0, 1, 1 pos_hint: {'center_x': 0.5, 'center_y': 0.45} size_hint: 0.25, 0.05 on_release: pass
测试说明
现在运行代码,进入登录页面输入用户名和密码,点击Submit按钮,控制台就会分别打印出你输入的用户名和密码啦。另外,如果你后续要处理新账号页面的Submit,也是同样的逻辑:用self.root.get_screen("NewAccount")获取对应Screen,再访问它的newusernameinput和newpasswordinput的文本就行。
内容的提问来源于stack exchange,提问作者bobthebuilder1212
相关产品推荐
相关产品推荐

