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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:42:30