我想从登录屏幕更新主屏幕。主屏幕中有一个标签,当按下登录按钮时应更新该标签。换句话说,当我按下登录屏幕上的登录按钮时,它应该显示“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'
但是当我运行我的代码时,它无法修改标签
我找不到解决方案
在您的
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'