KivyMD多屏幕场景下如何获取指定Screen内文本框的内容
问题:KivyMD多屏幕场景下无法获取输入框的值
我是Python和Kivy的新手,正在开发一款Android应用。基于KivyMD Navigation Drawer示例修改后,单屏幕场景下能正常获取scr 1中vorname_input文本框的值,但切换到多屏幕场景后无法实现。尝试print(self.root.ids.vorname_input.text)时输出为空,已搜索并尝试多种方法均无效。
相关代码
KV文件
<ContentNavigationDrawer> MDList: OneLineListItem: text: "Screen 1" on_press: root.nav_drawer.set_state("close") root.screen_manager.current = "scr 1" OneLineListItem: text: "Screen 2" on_press: root.nav_drawer.set_state("close") root.screen_manager.current = "scr 2" MDScreen: MDTopAppBar: pos_hint: {"top": 1} elevation: 4 title: "MDNavigationDrawer" left_action_items: [["menu", lambda x: nav_drawer.set_state("open")]] MDNavigationLayout: MDScreenManager: id: screen_manager MDScreen: name: "scr 1" BoxLayout: orientation: "vertical" spacing: "25dp" padding: [12, 80, 12, 12] MDTextField: id: vorname_input hint_text: "Vorname" mode: "rectangle" multiline: False icon_left: 'account' helper_text_mode: 'on_error' helper_text: '' mode: "fill" fill_color: 0, 0, 0, .4 MDFlatButton: font_size: 25 text: "Kunde Speichern" on_press: app.save_cust_to_db() md_bg_color: app.theme_cls.primary_color theme_text_color: "Custom" text_color: 0.93, 0.93, 0.93, 1 MDScreen: name: "scr 2" MDLabel: text: "Screen 2" halign: "center" MDNavigationDrawer: id: nav_drawer radius: (0, 16, 16, 0) ContentNavigationDrawer: screen_manager: screen_manager nav_drawer: nav_drawer
Py文件
from kivy.lang import Builder from kivy.properties import ObjectProperty from kivymd.app import MDApp from kivymd.uix.scrollview import MDScrollView class ContentNavigationDrawer(MDScrollView): screen_manager = ObjectProperty() nav_drawer = ObjectProperty() class Example(MDApp): def build(self): self.theme_cls.primary_palette = "Orange" self.theme_cls.theme_style = "Dark" return Builder.load_string(KV) def save_cust_to_db(self): print (self.root.ids.vorname_input.text) Example().run()
解决方案
原因分析
self.root.ids仅包含根部件(最外层MDScreen)直接声明的id,而vorname_input是嵌套在screen_manager下的scr 1屏幕内部的控件,不在根部件的ids集合中,因此直接访问会返回空值。
方法一:通过屏幕管理器获取控件
修改Py文件中的save_cust_to_db方法:
def save_cust_to_db(self): # 获取屏幕管理器实例 screen_manager = self.root.ids.screen_manager # 根据屏幕名称获取scr 1实例 scr1 = screen_manager.get_screen("scr 1") # 访问输入框文本 print(scr1.ids.vorname_input.text)
方法二:直接传递输入框值(更简洁)
修改KV文件中按钮的on_press事件,直接把输入框的值传给方法:
on_press: app.save_cust_to_db(vorname_input.text)
然后更新Py文件中的方法:
def save_cust_to_db(self, vorname_text): print(vorname_text)
内容的提问来源于stack exchange,提问作者Thomas Weckmann
相关产品推荐
相关产品推荐

