Киви: Как создать виджет on_start с высотой: self.minimum_height

#python #kivy #kivy-language #kivymd

Вопрос:

Я только что взял python и kivy/kivymd на этой неделе, поэтому я борюсь с тем, что, я уверен, действительно является базовыми вещами.

Я пытаюсь создать карточку on_start, которая по большей части работает нормально, но мне также нужно установить высоту в значение minimum_height, а также установить pos_hint (две закомментированные строки, хотя, очевидно, в этом случае это не будет self.minimum_height; это было скопировано из моего файла .kv).

 from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.card import MDCard


class MainApp(MDApp):
    def build(self):
        self.theme_cls.primary_palette = "LightGreen"
        self.theme_cls.primary_hue = "700"
        return Builder.load_file("main.kv")


    def on_start(self):
        self.root.ids.main_grid.add_widget(MDCard(
            size_hint_x = 1,
            size_hint_y = None,
            adaptive_height = True,
            # height = self.minimum_height,
            # pos_hint = {"center_x" = .5}
            spacing = 5,
            padding = 30,
            elevation = 18,
            ripple_behavior = True
        ))
        

MainApp().run()
 

Я понятия не имею, как назначить pos_hint таким образом, чтобы он не выдавал синтаксическую ошибку.

Для высоты я попытался установить

     def on_start(self):
        veg = self.root.ids.main_grid.add_widget(MDCard(
            size_hint_x = 1,
            size_hint_y = None,
            adaptive_height = True,
            # height = self.minimum_height,
            # pos_hint = {"center_x" = .5}
            spacing = 5,
            padding = 30,
            elevation = 18,
            ripple_behavior = True
        ))
 

А затем добавила

veg.height = veg.minimum_height

Который возвращает

AttributeError: 'NoneType' object has no attribute 'minimum_height'

Все остальное работает отлично. Без этих двух установленных свойств я могу запустить его, и карта отображается просто отлично. Просто у него неправильный размер. Какого вклада он ожидает?

Ответ №1:

Свойство adaptive_height не определено для MDCard . У вас pos_hint просто плохой синтаксис для словаря. Попробуйте изменить:

 pos_hint = {"center_x" = .5}
 

Для:

 pos_hint = {"center_x": .5}
 

В вашем коде the height = self.minimum_height пытается установить height MDCard minimum_height App значение » из » в » из » ( self находится MainApp в этом методе). Более простым подходом было бы определить правило для этого MDCard в kv . подобный этому:

 <MyMDCard>:
    size_hint_x: 1
    size_hint_y: None
    height: self.minimum_height
 

И определить MyMDCard как:

 class MyMDCard(MDCard):
    pass
 

Затем on_start() метод становится:

 def on_start(self):
    self.root.ids.main_grid.add_widget(MyMDCard(
        pos_hint = {"center_x": .5},
        spacing=5,
        padding=30,
        elevation=18,
        ripple_behavior=True
    ))