如何将Python代码获取的用户名传入Kivy作为MDToolbar标题
问题根因
当前写法无法生效的核心原因有三个:
- 未定义Kivy可动态追踪的绑定属性:直接在kv中引用普通Python类属性、局部实例属性时,属性值变更不会触发界面组件自动刷新
- 用户名的存储位置错误:原代码将获取到的用户名存在登录页的局部
self实例上,全局KV层无法直接读取到这个值 - 引用方式错误:KV中写
GipApp.username时,既没在App类中定义这个全局属性,也没有建立属性双向绑定关系,自然无法拿到值
落地实现方案
步骤1:改造全局App类,定义可绑定的用户名属性
在App定义代码中引入Kivy属性系统,创建全局可追踪的用户名字符串属性,让值变更可以自动同步到所有绑定的UI组件:
from kivy.properties import StringProperty from kivymd.app import MDApp class GipApp(MDApp): # 定义全局可绑定的用户名属性,初始值可设为默认占位文本 current_username = StringProperty("未登录用户") # 原有的build()、屏幕管理逻辑保持不变即可
步骤2:修改登录验证逻辑的用户名赋值逻辑
把原代码中登录成功分支的赋值从页面局部实例,改为写入全局App的可绑定属性:
def verify(self, username, password): if username != "" and password != "": for row in MySqlNames: if row[0].strip() == username: sql = "SELECT Password from ID191774_6itn1project7.Users where Username = %s " mycursor.execute(sql, (username)) TestPassword = mycursor.fetchall() for row3 in TestPassword: if row3[0].strip() == password: dialog = MDDialog(title="Login successful") dialog.open() # 替换原来的 self.username = username 代码 running_app = GipApp.get_running_app() running_app.current_username = username GipApp.get_running_app().root.current = 'main' if row3[0].strip() != password: dialog = MDDialog(title="Passwords is not correct.") dialog.open() else: dialog = MDDialog(title="Fill in the empty text boxes") dialog.open()
步骤3:修改KV布局的组件绑定关系
把原来MDToolbar的title引用改为绑定全局App的可追踪属性,KV层的app关键字可以直接引用当前运行的App实例,不需要手动写类名:
NavigationLayout: ScreenManager: Screen: orientation: 'vertical' MDToolbar: # 替换原来的 title: GipApp.username title: app.current_username left_action_items:[["menu",lambda x: nav_drawer.toggle_nav_drawer()]] elevation :12 pos_hint:{"center_x": .5, "center_y": .95}
备选方案
如果不想维护全局App属性,也可以在登录成功跳转主屏幕时,直接拿到目标屏幕的MDToolbar组件实例赋值标题:
- 给KV中的MDToolbar添加id标识:在组件属性里加
id: main_toolbar - 登录成功分支写组件赋值逻辑:
# 跳转到主屏幕后直接操作组件赋值 main_screen = self.manager.get_screen('main') main_screen.ids.main_toolbar.title = username GipApp.get_running_app().root.current = 'main'
注意:直接操作组件赋值的方式需要确保主屏幕已经被加载到屏幕管理器中,否则会报找不到组件id的错误;全局属性绑定的方式不存在这个问题,就算组件还没渲染,等它加载完成时会自动读取最新的属性值显示。
内容的提问来源于stack exchange,提问作者voiture
相关产品推荐
相关产品推荐

