Как добавить действия к кнопке в KivyMD MDDialog? - PullRequest
1 голос
/ 06 мая 2020

Как добавить действие к кнопке «ОК»? Я получил пример кода из документации 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 и добавить действие (on_release) в MDFlatButton с помощью text = "OK", но это мне не помогает. Буду признателен за любой совет.

1 Ответ

1 голос
/ 06 мая 2020

Как вы уже упоминали, вы можете выполнить некоторые действия щелчка, если вы установите собственный метод для атрибутов on_press или on_release в MDFlatButtons.

Причина:

Причина, по которой он не работал правильно, заключалась в том, что высота диалогового окна не доходила до позиции, на которой были установлены кнопки . Мне пришлось самому вырыть это, когда установка пользовательских методов для атрибута on_press не сработала, и закрыть диалог.

Решение:

Конечно, вы можете установить высоту самостоятельно, но к счастью, в классе MDDialog есть метод set_normal_height () , который равен 80 % от высоты окна, как вы можете увидеть, погрузившись в исходный код kivymd. Этого достаточно, чтобы включить кнопку в (невидимую) область диалогового окна.

Теперь вы можете go включить, как обычно, и определить собственные методы, которые вызываются при нажатии или отпускании кнопки. Вот краткий пример того, как вы можете получить значение textinputs. Вам не нужна часть 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()
...