使用KivyMD与ScreenManager实现登录登出页面遇TypeError问题求助
解决KivyMD+ScreenManager登录登出页面的TypeError问题
问题分析
你遇到的TypeError: 'NoneType' object is not subscriptable由多个KV语法和逻辑错误共同导致:
- 自定义
ScreenManager类与kivy内置的ScreenManager重名,导致KV语言解析时实例化出错。 LogoutScreen中的MDLabel缩进层级错误,破坏了KV的语法结构,引发解析异常。- 通过
self.root.ids直接访问子Screen中的控件是错误逻辑——ScreenManager的ids不会包含子Screen内部的控件。 LogoutScreen中使用了未导入的BoxLayout,改用MDBoxLayout更符合KivyMD组件规范。
修复步骤
移除重名的自定义ScreenManager类
删除代码中class ScreenManager(ScreenManager): pass这一行,避免覆盖kivy内置的ScreenManager组件。修正KV中的布局组件与缩进问题
将LogoutScreen中的BoxLayout替换为MDBoxLayout,并调整MDLabel的缩进,使其与MDRaisedButton处于同一层级,保证KV语法解析正常。正确访问子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
相关产品推荐
相关产品推荐

