You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:45:36