如何用Kivy在不同类的LoginScreen中更新HomeScreen的Label
解决LoginScreen更新HomeScreen中Label内容的问题
问题根源
- 错误创建新实例:你在
log_in方法中新建了HomeScreen()对象,这是一个未被添加到界面的全新实例,修改它的Label不会影响屏幕上实际显示的HomeScreen。 - 拼写错误:代码里的
makup是笔误,正确属性名是markup。 - 控件路径错误:
lab控件嵌套在HomeScreen内部的ScreenManager的firstscreen里,直接通过home_screen.ids.lab无法找到该控件。
修正后的代码
main.py
from kivymd.app import MDApp from kivy.lang import Builder from kivy.uix.screenmanager import ScreenManager, Screen Builder.load_file('home.kv') Builder.load_file('login.kv') Builder.load_string( """ <ManagerScreen>: LoginScreen: id: login name: 'login' MDScreen: id: register name: 'register' HomeScreen: id: home name: 'home' """ ) class HomeScreen(Screen): def __init__(self, **kwargs): super(HomeScreen, self).__init__(**kwargs) class LoginScreen(Screen): def __init__(self, **kwargs): super(LoginScreen, self).__init__(**kwargs) def log_in(self): username = self.ids.username.text pwd = self.ids.pwd.text # 获取ScreenManager中已存在的HomeScreen实例 home_screen = self.parent.get_screen('home') # 定位到嵌套的firstscreen里的Label控件 welcome_label = home_screen.ids.sm.get_screen('firstscreen').ids.lab welcome_label.markup = True welcome_label.text = "[color=ff0000]Bienvenu Monsieur {}[/color]".format(username) self.parent.current = 'home' class ManagerScreen(ScreenManager): def __init__(self, **kwargs): super(ManagerScreen, self).__init__(**kwargs) class MainApp(MDApp): def build(self): return ManagerScreen() if __name__ == '__main__': MainApp().run()
额外修正(home.kv)
你的home.kv里两个按钮使用了相同的id: first,会导致控件ID冲突,建议修改为不同ID:
#:import utils kivy.utils <HomeScreen>: MDBoxLayout: orientation: 'vertical' MDBoxLayout: size_hint_y: None height: btn_screen1.height MDRaisedButton: id: btn_screen1 text: "Ecran 1" on_press: sm.current = 'firstscreen' MDRaisedButton: id: btn_screen2 text: "Ecran 2" on_press: sm.current = 'secondscreen' ScreenManager: id: sm Screen: id: firstscreen name: 'firstscreen' MDRelativeLayout: MDCard: orientation: 'vertical' md_bg_color: utils.get_color_from_hex('#3e55c9') MDLabel: id: lab markup: True MDRaisedButton: id: buttontext text: 'importer fichier' Screen: id: secondscreen name: 'secondscreen'
关键说明
- 使用
self.parent.get_screen('home')获取已存在于ScreenManager中的HomeScreen实例,这才是界面上实际显示的对象。 - 由于
lab控件在HomeScreen内部的子ScreenManager(id为sm)的firstscreen里,所以需要通过完整路径定位到该Label。 - 修正
markup拼写错误,确保富文本格式正常生效。
内容的提问来源于stack exchange,提问作者Borris Kouadja NIANGORAN
相关产品推荐
相关产品推荐

