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

如何用Kivy在不同类的LoginScreen中更新HomeScreen的Label

解决LoginScreen更新HomeScreen中Label内容的问题

问题根源

  1. 错误创建新实例:你在log_in方法中新建了HomeScreen()对象,这是一个未被添加到界面的全新实例,修改它的Label不会影响屏幕上实际显示的HomeScreen。
  2. 拼写错误:代码里的makup是笔误,正确属性名是markup。
  3. 控件路径错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:02:39