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

如何在Py文件的MDialog中获取MDTextField的值(KivyMD2.0.1)

在Python代码中获取MDDialog内MDTextField的文本值

在Python里动态创建MDialog时,直接给MDTextField设置id='xxx'不会像kv文件那样自动加入到组件的ids字典里,可通过以下几种方式解决:

方法1:直接持有MDTextField实例(最推荐)

创建TextField时把它赋值给类变量,之后直接通过变量的.text属性获取内容,简单高效。

from kivymd.app import MDApp
from kivymd.uix.dialog import MDDialog
from kivymd.uix.textfield import MDTextField
from kivymd.uix.button import MDFlatButton

class TestApp(MDApp):
    def show_dialog(self):
        # 创建TextField并保存为类实例变量
        self.tipo_input = MDTextField(hint_text="请输入内容")
        self.dialog = MDDialog(
            title="输入对话框",
            type="custom",
            content_cls=self.tipo_input,
            buttons=[
                MDFlatButton(text="确认", on_release=self.get_input_text),
                MDFlatButton(text="取消", on_release=self.dialog.dismiss)
            ]
        )
        self.dialog.open()

    def get_input_text(self, instance):
        # 直接通过实例获取文本
        print("输入的内容:", self.tipo_input.text)
        self.dialog.dismiss()

TestApp().run()

方法2:手动将TextField加入到组件的ids字典

如果习惯用ids访问,可以把创建好的TextField手动添加到当前Widget的ids字典中,之后就能像kv里那样通过self.ids.xxx调用。

from kivymd.app import MDApp
from kivymd.uix.dialog import MDDialog
from kivymd.uix.textfield import MDTextField
from kivymd.uix.button import MDFlatButton
from kivymd.uix.screen import MDScreen

class MainScreen(MDScreen):
    def show_dialog(self):
        tipo_input = MDTextField(hint_text="请输入内容")
        # 手动把TextField加入当前屏幕的ids字典
        self.ids["tipo"] = tipo_input
        
        self.dialog = MDDialog(
            title="输入对话框",
            type="custom",
            content_cls=tipo_input,
            buttons=[
                MDFlatButton(text="确认", on_release=self.get_input_text),
                MDFlatButton(text="取消", on_release=self.dialog.dismiss)
            ]
        )
        self.dialog.open()

    def get_input_text(self, instance):
        # 通过ids访问TextField的文本
        print("输入的内容:", self.ids.tipo.text)
        self.dialog.dismiss()

class TestApp(MDApp):
    def build(self):
        return MainScreen()

TestApp().run()

方法3:遍历Dialog的子组件查找

如果Dialog的内容是复杂布局(比如包含多个组件的BoxLayout),可以遍历布局的子组件,通过id或类型找到目标TextField。

from kivymd.app import MDApp
from kivymd.uix.dialog import MDDialog
from kivymd.uix.textfield import MDTextField
from kivymd.uix.button import MDFlatButton
from kivymd.uix.boxlayout import MDBoxLayout

class TestApp(MDApp):
    def show_dialog(self):
        # 创建包含多个TextField的布局
        content_layout = MDBoxLayout(orientation="vertical", spacing=15, padding=20)
        content_layout.add_widget(MDTextField(hint_text="类型", id="tipo"))
        content_layout.add_widget(MDTextField(hint_text="备注"))
        
        self.dialog = MDDialog(
            title="多输入对话框",
            type="custom",
            content_cls=content_layout,
            buttons=[
                MDFlatButton(text="确认", on_release=self.get_input_text),
                MDFlatButton(text="取消", on_release=self.dialog.dismiss)
            ]
        )
        self.dialog.open()

    def get_input_text(self, instance):
        # 遍历布局的子组件,找到id为tipo的TextField
        for widget in self.dialog.content_cls.children:
            if hasattr(widget, "id") and widget.id == "tipo":
                print("类型输入内容:", widget.text)
                break
        self.dialog.dismiss()

TestApp().run()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:23:12