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

如何将KivyMD中EntryScreen的MDTextField内容传入ConfirmationScreen的MDLabel?

KivyMD 跨屏幕传递输入内容方案

要实现将EntryScreen中MDTextField的输入内容传递到ConfirmationScreen的MDLabel,有三种直接可行的实现方式,以下是具体步骤:

方案一:通过ScreenManager直接访问目标屏幕组件

思路

在切换屏幕时,通过ScreenManager获取到ConfirmationScreen实例,直接将输入框的内容赋值给目标标签的text属性。需要先给EntryScreen添加触发切换的按钮,再在代码中处理切换逻辑。

修改后的代码

KV语言代码

<EntryScreen>:
    name: 'entry_screen'
    MDCard:
        size_hint: None, None
        size: 500, 750
        pos_hint: {"center_x": 0.5, "center_y": 0.5}
        elevation: 10
        padding: 25
        spacing: 25
        orientation: 'vertical'

        MDLabel:
            id: number_label
            text: "3 Digit Number"
            font_size: 25
            halign: 'center'
            size_hint_y: None
            height: self.texture_size[1]

        MDTextField:
            mode: "round"
            id: number
            input_filter: 'int'
            max_text_length: 3
            hint_text: "3 Digit Number"
            valign: 'center'
            icon_right: "apps"
            size_hint_x: None
            width: 250
            font_size: 18
            pos_hint: {"center_x": 0.5}

        MDRaisedButton:
            text: "确认"
            pos_hint: {"center_x": 0.5}
            on_release:
                # 获取输入内容并切换屏幕
                app.root.get_screen('confirm_screen').ids.confirm_label.text = self.parent.ids.number.text
                app.root.current = 'confirm_screen'

<ConfirmationScreen>:
    name: 'confirm_screen'
    MDCard:
        size_hint: None, None
        size: 500, 750
        pos_hint: {"center_x": 0.5, "center_y": 0.5}
        elevation: 10
        padding: 25
        spacing: 25
        orientation: 'vertical'

        MDLabel:
            id: confirm_label
            text: ""
            font_size: 30
            halign: 'center'
            size_hint_y: None
            height: self.texture_size[1]

        MDRaisedButton:
            text: "返回"
            pos_hint: {"center_x": 0.5}
            on_release: app.root.current = 'entry_screen'

Python代码

from kivymd.app import MDApp
from kivymd.uix.screen import MDScreen
from kivy.uix.screenmanager import ScreenManager

class EntryScreen(MDScreen):
    pass

class ConfirmationScreen(MDScreen):
    pass

class NumberApp(MDApp):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(EntryScreen(name='entry_screen'))
        sm.add_widget(ConfirmationScreen(name='confirm_screen'))
        return sm

if __name__ == '__main__':
    NumberApp().run()

方案二:利用Kivy属性绑定实现实时同步

思路

给ConfirmationScreen定义一个StringProperty,将其与EntryScreen中MDTextField的text属性绑定,实现输入内容的实时同步,无需手动触发赋值。

修改后的代码

Python代码(新增属性定义)

from kivymd.app import MDApp
from kivymd.uix.screen import MDScreen
from kivy.uix.screenmanager import ScreenManager
from kivy.properties import StringProperty

class EntryScreen(MDScreen):
    pass

class ConfirmationScreen(MDScreen):
    # 定义用于接收输入的属性
    input_text = StringProperty("")

class NumberApp(MDApp):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(EntryScreen(name='entry_screen'))
        sm.add_widget(ConfirmationScreen(name='confirm_screen'))
        # 绑定两个屏幕的属性
        sm.get_screen('entry_screen').ids.number.bind(text=sm.get_screen('confirm_screen').setter('input_text'))
        return sm

KV语言代码(修改ConfirmationScreen的Label)

<ConfirmationScreen>:
    name: 'confirm_screen'
    MDCard:
        # 其他代码不变
        MDLabel:
            id: confirm_label
            text: root.input_text
            font_size: 30
            halign: 'center'
            size_hint_y: None
            height: self.texture_size[1]

(EntryScreen的KV代码同方案一,保留确认按钮用于切换屏幕即可)

方案三:通过App类共享全局数据

思路

在App类中定义一个全局属性存储输入内容,让两个屏幕分别绑定到这个属性,实现数据共享。

修改后的代码

Python代码

from kivymd.app import MDApp
from kivymd.uix.screen import MDScreen
from kivy.uix.screenmanager import ScreenManager
from kivy.properties import StringProperty

class EntryScreen(MDScreen):
    pass

class ConfirmationScreen(MDScreen):
    pass

class NumberApp(MDApp):
    # 全局共享属性
    input_number = StringProperty("")

    def build(self):
        sm = ScreenManager()
        sm.add_widget(EntryScreen(name='entry_screen'))
        sm.add_widget(ConfirmationScreen(name='confirm_screen'))
        return sm

KV语言代码

<EntryScreen>:
    name: 'entry_screen'
    # 其他代码不变
    MDTextField:
        id: number
        # 绑定到App的全局属性
        text: app.input_number
        # 其他属性不变

<ConfirmationScreen>:
    name: 'confirm_screen'
    # 其他代码不变
    MDLabel:
        id: confirm_label
        text: app.input_number
        # 其他属性不变

内容的提问来源于stack exchange,提问作者Marshall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:58:11