首页 > 解决方案 > 如何在kivy的屏幕加载上动态更新标签的值

问题描述

所以我想做的是,我做了一个login-register systemin Python-Kivy. 现在,每当用户登录我的应用程序时,我name都想usernamenavigation-drawer. 但问题是,IDs我试图更新价值的,正在抛出AttributeError. 虽然我可以IDs在手动访问时使用on_release按钮事件来访问这些,但我想要做的是DashboardScreen在我的应用程序上呈现后立即访问它们。这是我尝试过的原始代码:

# Importing Kivy Widgets
from os import name
from kivy.core.window import Window
from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.lang import Builder
from kivy.clock import Clock

layout_string = '''
ScreenManager:
    Home:
    Dashboard:
<Home>:
    name: 'HomeScreen'
    MDToolbar:
        title: 'MyApp'
        pos_hint: {'top': 1}
        elevation: 10
    MDFillRoundFlatIconButton:
        icon: 'login-variant'
        text: 'Login'
        pos_hint: {'center_x': 0.5, 'center_y': 0.5}
        on_release:
            root.manager.current = 'DashboardScreen'
            root.manager.transition.direction = 'left'
<Dashboard>:
    name: 'DashboardScreen'
    user_avatar: user_avatar
    user_name: user_name
    user_username: user_username
    MDToolbar:
        title: 'MyDashboard'
        pos_hint: {'top': 1}
        elevation: 10
        left_action_items: [['menu', lambda my_nav: my_nav_drawer.set_state('toggle')]]
    MDNavigationDrawer:
        id: my_nav_drawer
        BoxLayout:
            orientation: 'vertical'
            padding: '8dp'
            spacing: '8dp'

            AnchorLayout:
                anchor_x: 'left'
                size_hint_y: None
                height: user_avatar.height

                AsyncImage:
                    id: user_avatar
                    size_hint: None, None
                    size: '56dp', '56dp'
                    source: 'https://upload.wikimedia.org/wikipedia/commons/5/58/Kivy_logo.png'
            MDLabel:
                id: user_name
                text: 'Kivy'
                font_style: 'Button'
                size_hint_y: None
                height: self.texture_size[1]

            MDLabel:
                id: user_username
                text: 'kivypython'
                font_style: 'Caption'
                size_hint_y: None
                height: self.texture_size[1]

            ScrollView:
'''

class MyApp(MDApp):
    def build(self):
        screen = Screen()
        layout = Builder.load_string(layout_string)
        screen.add_widget(layout)
        return screen


class Home(Screen):
    pass


class Dashboard(Screen):
    def on_enter(self, *args):
        self.user_name.text = 'MyName'
        self.user_username.text = 'MyUserName'


if __name__ == '__main__':
    Window.size = (300, 500)
    scr_mngr = ScreenManager()
    scr_mngr.add_widget(Home(name='HomeScreen'))
    MyApp().run()

我正在尝试使用用户信息访问和更新它们user_avatar,但是使用上述方法会抛出:user_nameuser_username

AttributeError: 'Dashboard' object has no attribute 'user_name'

这是完整的错误日志:

Traceback (most recent call last):
   File "c:\Users\yash\Desktop\question.py", line 90, in <module>
     MyApp().run()
   File "C:\ProgramData\Anaconda3\lib\site-packages\kivy\app.py", line 950, in run
     runTouchApp()
   File "C:\ProgramData\Anaconda3\lib\site-packages\kivy\base.py", line 582, in runTouchApp
     EventLoop.mainloop()
   File "C:\ProgramData\Anaconda3\lib\site-packages\kivy\base.py", line 347, in mainloop
     self.idle()
   File "C:\ProgramData\Anaconda3\lib\site-packages\kivy\base.py", line 387, in idle
     Clock.tick()
   File "C:\ProgramData\Anaconda3\lib\site-packages\kivy\clock.py", line 733, in tick
     self.post_idle(ts, self.idle())
   File "C:\ProgramData\Anaconda3\lib\site-packages\kivy\clock.py", line 776, in post_idle
     self._process_events()
   File "kivy\_clock.pyx", line 616, in kivy._clock.CyClockBase._process_events
   File "kivy\_clock.pyx", line 649, in kivy._clock.CyClockBase._process_events
   File "kivy\_clock.pyx", line 645, in kivy._clock.CyClockBase._process_events
   File "kivy\_clock.pyx", line 218, in kivy._clock.ClockEvent.tick
   File "C:\ProgramData\Anaconda3\lib\site-packages\kivy\animation.py", line 353, in _update
     self.stop(widget)
   File "C:\ProgramData\Anaconda3\lib\site-packages\kivy\animation.py", line 218, in stop
     self.dispatch('on_complete', widget)
   File "kivy\_event.pyx", line 705, in kivy._event.EventDispatcher.dispatch
   File "kivy\_event.pyx", line 1248, in kivy._event.EventObservers.dispatch
   File "kivy\_event.pyx", line 1172, in kivy._event.EventObservers._dispatch
   File "C:\ProgramData\Anaconda3\lib\site-packages\kivy\uix\screenmanager.py", line 419, in _on_complete
     self.screen_in.dispatch('on_enter')
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "c:\Users\yash\Desktop\question.py", line 81, in on_enter
     self.user_name.text = 'MyName'
 AttributeError: 'Dashboard' object has no attribute 'user_name'

DashboardClass但是,我确实设法通过更改我的代码来做我想做的事情

class Dashboard(Screen):
    def on_kv_post(self, base_widget):
        Clock.schedule_once(self.callback, 0)

    def callback(self, dt):
        try:
            self.user_name.text = 'MyName'
            self.user_username.text = 'MyUserName'
        except:
            Clock.schedule_once(self.callback, 0)

现在我不知道为什么,但我感觉我对代码所做的更新不是真正的。你能告诉我一个好的方法,如果它不是那个或者它是好的吗?

标签: pythonpython-3.xkivykivy-language

解决方案


推荐阅读