python - 如何在kivy的屏幕加载上动态更新标签的值
问题描述
所以我想做的是,我做了一个login-register system
in Python-Kivy
. 现在,每当用户登录我的应用程序时,我name
都想username
在navigation-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_name
user_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)
现在我不知道为什么,但我感觉我对代码所做的更新不是真正的。你能告诉我一个好的方法,如果它不是那个或者它是好的吗?
解决方案
推荐阅读
- python - Python 包不通过 pip 安装
- r - 从每个节点高效地找到所有可达节点
- php - Laravel:尝试检测一系列十六进制颜色
- amazon-web-services - 托管在 EC2 上的网站无法访问 S3 图像链接
- python - python数据框更改索引类型并删除重复项
- sql-server - VS 2019 无法连接到 SQL Server
- python - pygame 开始运行时出现错误
- assembly - 从 C 到汇编程序的 PTR 错误和偏移量
- javascript - react-native中屏幕变化时如何实现callBack功能?
- python - 我的石头剪刀布没有给我任何输出(python)