如何从另一个屏幕更新一个屏幕,两者都与 kivy 位于不同的类中

问题描述 投票:0回答:1

我想从登录屏幕更新主屏幕。主屏幕中有一个标签,当按下登录按钮时应更新该标签。换句话说,当我按下登录屏幕上的登录按钮时,它应该显示“Welcome Mr”加上用户名。

这是我的 main.py 代码

from kivymd.app import MDApp
from kivymd.uix.relativelayout import MDRelativeLayout
from kivymd.uix.boxlayout import MDBoxLayout
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

        home_screen = HomeScreen()
        home_screen.ids.lab.makup = True
        home_screen.ids.lab.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()

登录.kv:

<LoginScreen>:
    MDRelativeLayout:
        MDCard:
            size_hint: .5, .4
            pos_hint: {'center_x':.5, 'center_y':.5}
            orientation: 'vertical'
            padding: 10
            spacing: 10
            MDTextField:
                id: username
                hint_text: "Nom d'utilisateur"
            MDTextField:
                id: pwd
                hint_text: "Mot de passe"
            MDRaisedButton:
                text: 'Log In'
                pos_hint: {'center_x':.5}
                on_press: root.log_in()
            MDTextButton:
                text: "Créez un compte si vous n'en avez pas!"
                pos_hint: {'center_x':.5}
                on_press: root.parent.parent.current = 'register'

home.kv

#:import utils kivy.utils

<HomeScreen>:
    MDBoxLayout:
        orientation: 'vertical'
        MDBoxLayout:
            size_hint_y: None
            height: first.height
            MDRaisedButton:
                id: first
                text: "Ecran 1"
                on_press: sm.current = 'firstscreen'
            MDRaisedButton:
                id: first
                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'

但是当我运行我的代码时,它无法修改标签

我找不到解决方案

python kivy
1个回答
0
投票

在您的

log_in()
方法中,该行:

home_screen = HomeScreen()

创建

HomeScreen
的新实例,该实例与通过使用
HomeScreen
创建的
Builder
实例无关。所以当你这样做时:

home_screen.ids.lab.text = "[color=ff0000]Bienvenu Monsieur {}[/color]".format(username)

您正在更改不在 GUI 中的

text
Label

修复方法是访问 GUI 中的

HomeScreen
实例。您可以通过
ScreenManager
:

来做到这一点
home_screen = self.manager.get_screen('home')

所以你的

log_in()
方法应该如下所示:

def log_in(self):
    username = self.ids.username.text
    pwd = self.ids.pwd.text

    # home_screen = HomeScreen()
    home_screen = self.manager.get_screen('home')
    home_screen.ids.lab.makup = True
    home_screen.ids.lab.text = "[color=ff0000]Bienvenu Monsieur {}[/color]".format(username)

    self.parent.current = 'home'
© www.soinside.com 2019 - 2024. All rights reserved.