Почему высота MDDialog не меняется в kivymd?

#python #kivy #kivymd

#python #kivy #kivymd

Вопрос:

Я реализовал простой MDDialog в kivymd. Но высота не меняется. Как я могу изменить высоту диалогового окна?

Я создал boxlayout, а затем добавил к ним четыре метки. Затем я добавил его в диалоговое окно. Это работает, но высота не меняется.

main.py

 from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen
from kivy.lang import Builder
from kivymd.uix.dialog import MDDialog
from kivy.metrics import dp
from build_string import helper_string
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.label import MDLabel


class MainScreen(Screen):
    pass


class MainApp(MDApp):

    def build(self):
        self.dialog = ""

        self.sm = Builder.load_string(helper_string)
        return self.sm

    def show_alert_dialog(self):
        if not self.dialog:
            self.dialog = MDDialog(
                size_hint= [0.9, None],
                type="custom",
                height=dp(800)
            )

            box = MDBoxLayout(
                orientation='vertical',
                adaptive_height=True,
                padding=dp(28),
                spacing=dp(15))

            l1 = MDLabel(text="Label 1")
            box.add_widget(l1)

            l2 = MDLabel(text="Label 2")
            box.add_widget(l2)

            l3 = MDLabel(text="Label 3")
            box.add_widget(l3)

            l4 = MDLabel(text="Label 4")
            box.add_widget(l4)

            self.dialog.add_widget(box)

        self.dialog.open()


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

build_string.py

 helper_string = """
ScreenManager:
    id: screen_manager
    MainScreen:

<MainScreen>:
    name: 'main_screen'
    BoxLayout:
        orientation: "vertical"
        spacing: "5dp"

        MDToolbar:
            id: toolbar
            pos_hint: {'bottom': 1}
            left_action_items: [["menu", lambda x: app.show_alert_dialog()]]   
"""
  

Как я могу изменить высоту MDDialog?

Что будет альтернативой для отображения этого в виде всплывающего сообщения с пользовательской высотой?

Комментарии:

1. Похоже, это ошибка.

Ответ №1:

В MDDialog он изменяет высоту только тогда, когда type=’custom’ и только если доступен параметр contetnt_cls . Поэтому при добавлении содержимого в MDDialog вместо добавления непосредственно в диалоговое окно используйте другой класс с вашим содержимым и добавьте его с аргументом content_cls . Теперь измените высоту класса содержимого, а затем MDDialog установит высоту диалогового окна в соответствии с высотой content_cls с помощью метода update_height .

Например, вот как это делается.

 from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen
from kivy.lang import Builder
from kivymd.uix.dialog import MDDialog
from kivy.metrics import dp
from kivy.lang import Builder
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.label import MDLabel

helper_string = """
ScreenManager:
    id: screen_manager
    MainScreen:

<MainScreen>:
    name: 'main_screen'
    BoxLayout:
        orientation: "vertical"
        spacing: "5dp"
        MDToolbar:
            id: toolbar
            pos_hint: {'bottom': 1}
            left_action_items: [["menu", lambda x: app.show_alert_dialog()]]   
"""


class MainScreen(Screen):
    pass


dialog_contetnt = Builder.load_string("""
<DialogContent>:
    orientation: 'vertical'
    size_hint_y: None
    height: dp(200)
    MDLabel:
        text: 'Label 1'
    MDLabel:
        text: 'Label 2'
    MDLabel:
        text: 'Label 3'
    MDLabel:
        text: 'Label 4'
        
""")

class DialogContent(MDBoxLayout):
    pass


class MainApp(MDApp):

    def build(self):
        self.dialog = ""

        self.sm = Builder.load_string(helper_string)
        return self.sm

    def show_alert_dialog(self):
        if not self.dialog:
            self.dialog = MDDialog(
                size_hint= [0.9, None],
                type="custom",
                content_cls=DialogContent(),
            )

        self.dialog.open()


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