#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()