如何在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
相关产品推荐
相关产品推荐

