【问题标题】:How can I add actions to the button in KivyMD MDDialog?如何向 KivyMD MDDialog 中的按钮添加操作?
【发布时间】:2020-05-06 08:17:13
【问题描述】:

如何将操作添加到“确定”按钮?我从 KivyMd 文档中获得了示例代码,但没有说明如何将操作添加到这些按钮。代码:

from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout

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

KV = '''
<Content>
    orientation: "vertical"
    spacing: "12dp"
    size_hint_y: None
    height: "120dp"

    MDTextField:
        hint_text: "City"

    MDTextField:
        hint_text: "Street"


FloatLayout:

    MDFlatButton:
        text: "ALERT DIALOG"
        pos_hint: {'center_x': .5, 'center_y': .5}
        on_release: app.show_confirmation_dialog()
'''


class Content(BoxLayout):
    pass


class Example(MDApp):
    dialog = None

    def build(self):
        return Builder.load_string(KV)

    def show_confirmation_dialog(self):
        if not self.dialog:
            self.dialog = MDDialog(
                title="Address:",
                type="custom",
                content_cls=Content(),
                buttons=[
                    MDFlatButton(
                        text="CANCEL", text_color=self.theme_cls.primary_color
                    ),
                    MDFlatButton(
                        text="OK", text_color=self.theme_cls.primary_color
                    ),
                ],
            )
        self.dialog.open()


Example().run()

单击“确定”后,我想从 MDTextField(城市和街道)中获取文本。我认为我应该为这些 MDTextFields 创建 ID,并使用 text="OK" 向 MDFlatButton 添加操作(on_release),但这对我没有帮助。如有任何建议,我将不胜感激。

【问题讨论】:

    标签: python kivy mddialog


    【解决方案1】:

    正如您已经提到的,如果您将自定义方法设置为 MDFlatButtons 的 on_press 或 on_release 属性,则可以实现一些点击操作。

    原因:

    它不能正常工作的原因是对话框的高度没有达到按钮设置的位置。当为 on_press 属性设置自定义方法不起作用并关闭对话框时,我不得不自己挖掘出来。

    解决方案:

    当然你可以自己设置高度,但是幸运的是 MDDialog 类有一个名为 set_normal_height() 的方法,它是窗口高度的 80%,当你深入源码时可以看到kivymd 的代码。这足以将按钮包含在对话框的(不可见)区域中。

    现在您可以像往常一样继续定义在按下或释放按钮时调用的自定义方法。这是一个简短的示例,您可以如何获取 textinputs 值。正如您已经提到的那样,当您为文本输入分配 ID 时,您不需要 isinstance 部分。重要的部分是我在对话框打开之前插入了 self.dialog.set_normal_height() 方法。我希望它也对你有用。

    示例:

    from kivy.lang import Builder
    from kivy.uix.boxlayout import BoxLayout
    
    from kivymd.app import MDApp
    from kivymd.uix.button import MDFlatButton
    from kivymd.uix.dialog import MDDialog
    from kivymd.uix.textfield import MDTextField
    
    KV = '''
    <Content>
        orientation: "vertical"
        spacing: "12dp"
        size_hint_y: None
        height: "120dp"
    
        MDTextField:
            hint_text: "City"
    
        MDTextField:
            hint_text: "Street"
    
    
    FloatLayout:
    
        MDFlatButton:
            text: "ALERT DIALOG"
            pos_hint: {'center_x': .5, 'center_y': .5}
            on_release: app.show_confirmation_dialog()
    '''
    
    
    class Content(BoxLayout):
        pass
    
    
    
    class Example(MDApp):
        dialog = None
    
        def build(self):
            return Builder.load_string(KV)
    
        def show_confirmation_dialog(self):
            if not self.dialog:
                self.dialog = MDDialog(
                    title="Address:",
                    type="custom",
                    content_cls=Content(),
                    buttons=[
                        MDFlatButton(
                            text="CANCEL", text_color=self.theme_cls.primary_color, on_release= self.closeDialog
                        ),
                        MDFlatButton(
                            text="OK", text_color=self.theme_cls.primary_color, on_release=self.grabText
                        ),
                    ],
                )
            self.dialog.set_normal_height()
            self.dialog.open()
    
    
        def grabText(self, inst):
            for obj in self.dialog.content_cls.children:
                if isinstance(obj, MDTextField):
                    print(obj.text)
            self.dialog.dismiss()
    
        def closeDialog(self, inst):
            self.dialog.dismiss()
    
    
    Example().run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 2012-09-23
      • 2022-07-07
      • 2016-01-08
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      相关资源
      最近更新 更多