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

使用KivyMD与ScreenManager实现登录登出页面遇TypeError问题求助

解决KivyMD+ScreenManager登录登出页面的TypeError问题

问题分析

你遇到的TypeError: 'NoneType' object is not subscriptable由多个KV语法和逻辑错误共同导致:

  1. 自定义ScreenManager类与kivy内置的ScreenManager重名,导致KV语言解析时实例化出错。
  2. LogoutScreen中的MDLabel缩进层级错误,破坏了KV的语法结构,引发解析异常。
  3. 通过self.root.ids直接访问子Screen中的控件是错误逻辑——ScreenManager的ids不会包含子Screen内部的控件。
  4. LogoutScreen中使用了未导入的BoxLayout,改用MDBoxLayout更符合KivyMD组件规范。

修复步骤

  1. 移除重名的自定义ScreenManager类
    删除代码中class ScreenManager(ScreenManager): pass这一行,避免覆盖kivy内置的ScreenManager组件。

  2. 修正KV中的布局组件与缩进问题
    将LogoutScreen中的BoxLayout替换为MDBoxLayout,并调整MDLabel的缩进,使其与MDRaisedButton处于同一层级,保证KV语法解析正常。

  3. 正确访问子Screen中的控件
    在submit方法中,通过self.root.get_screen("login")获取登录页面实例,再访问其内部的输入框;同理,通过self.root.get_screen("logout")获取登出页面实例来更新标签内容。

修复后的完整代码

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

# 设置窗口大小
Config.set('graphics', 'width', '800')
Config.set('graphics', 'height', '400')

KV="""
ScreenManager:
    LoginScreen:
    LogoutScreen:

<LoginScreen>:
    name: "login"
    MDBoxLayout:
        orientation:"vertical"
        padding: 180
        spacing: 10
        
        MDTextField:
            id: user_name
            hint_text:"Enter Username or Email"
            helper_text: "username must be unique"
            helper_text_mode:"on_focus"
            icon_left:"account"
            pos_hint:{"center_x":0.5,"center_y":0.5}
            size_hint:(None,None)
            width:300
        
        MDTextField:
            id: password
            hint_text:"Password [8-20 chars]"
            helper_text: "Password must contain number, special char"
            helper_text_mode:"on_focus"
            icon_left:"lock-off"
            pos_hint:{"center_x":0.5,"center_y":0.5}
            size_hint:(None,None)
            width:300
            
        MDRaisedButton:
            text:"Login"
            pos_hint:{"center_x":0.5,"center_y":0.5}
            on_release:
                app.submit()
                app.root.current="logout"
                root.manager.transition.direction = "left"
                
<LogoutScreen>:
    name:"logout"
    MDBoxLayout:
        orientation: 'vertical'
        spacing: 20
        padding: 50
        
        MDLabel:
            id: display_label
            text: ''
            theme_text_color: "Secondary"
            halign: 'center'
            font_style: "H6"
            size_hint_y: None
            height: self.texture_size[1]
        
        MDRaisedButton:
            text: "LogOut"
            pos_hint:{"center_x":0.5,"center_y":0.5}
            on_release:
                app.root.current="login"
                root.manager.transition.direction = "right"
"""

class LogoutScreen(Screen):
    pass

class LoginScreen(Screen):
    pass

class MOgggg(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def submit(self):
        # 获取登录页面的控件实例
        login_screen = self.root.get_screen("login")
        email = login_screen.ids.user_name.text
        password = login_screen.ids.password.text
        
        # 更新登出页面的标签内容
        logout_screen = self.root.get_screen("logout")
        logout_screen.ids.display_label.text = f"Hi {email}, You're successfully logged in!\nYour password (for demo): {password}"
        
        print(f"Email: {email}, Password: {password}")

MOgggg().run()

额外优化说明

  • 修正了密码提示文本中的拼写错误("spacial"改为"special","words"改为"chars")。
  • 给LogoutScreen的MDBoxLayout添加了spacing和padding,优化布局显示效果。
  • 修正了"You'r"的拼写错误为"You're"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:17:00