为什么MDDialog高度在kivymd中不改变?

时间:2020-09-19 12:55:20

标签: python kivy kivymd

我在kivymd中实现了简单的MDDialog。但是身高并没有改变。如何更改对话框的高度?

我创建了一个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 个答案:

答案 0 :(得分:0)

在 MDDialog 中,它仅在 type='custom' 且仅当 contetnt_cls 参数可用时更改高度。因此,当将内容添加到 MDDialog 时,不要直接添加到对话框中,而是将另一个类与您的内容一起使用,并使用 content_cls 参数添加它。 现在改变 content 类的高度,然后 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()