0

我从 MDCard (kivyMD) 创建了一个自定义小部件:

# layout.kv


<CustomMenuCard>
    id: menu_card

    # variables
    label_text: self.label_text
    progress_value: self.progress_value
    player_level: self.player_level

    orientation: "vertical"
    focus_behavior: True
    ripple_behavior: True
    padding: "5sp", "5sp"

    on_press: root.start_exercise(self)

    MDBoxLayout:
        orientation: "vertical"
        pos_hint: {'center_x': .5, 'center_y': .5}

        MDLabel:
            text: menu_card.label_text

            font_size: self.width * 0.15 if self.width*0.15 < 20 else 20
            halign: "center"
            size_hint_y: None

        MDBoxLayout:
            adaptive_height: False
            padding: "10sp", "-20sp", "10sp", 0

            MDLabel:
                text: menu_card.player_level

                font_size: "10sp"
                size_hint: 0.4, None
                halign: 'center'
                pos_hint: {"center_x": 0.5, "center_y": .5}
                theme_text_color: "Primary"

            MDProgressBar:
                value: menu_card.progress_value
                color: app.theme_cls.accent_color
# app.py

class CustomMenuCard(MDCard):
    label_text: StringProperty('')
    progress_value: NumericProperty()
    player_level: StringProperty('')
    pass

它工作正常,如果我在使用它之前重新创建卡。而不是任何其他方式。

所以,这行得通;

<MenuScreen>:
    BoxLayout:
        orientation: 'vertical'
        padding: 2, 2

        GridLayout:
            cols: 2
            spacing: 10
            padding: 7, 7

            MDCard:
                # same code as above 
                # ...


            CustomMenuCard:
                label_text: 'Substraction'
                progress_value: 6
                player_level: 'L3'

           # And another 2
           # ...

但这不会:

<MenuScreen>:
    BoxLayout:
        orientation: 'vertical'
        padding: 2, 2

        GridLayout:
            cols: 2
            spacing: 10
            padding: 7, 7

            CustomMenuCard:
                label_text: 'Substraction'
                progress_value: 6
                player_level: 'L3'

           # And another 3
           # ...

错误:

 Traceback (most recent call last):
   File "/home/echologic/.local/lib/python3.7/site-packages/kivy/lang/builder.py", line 696, in _apply_rule
     setattr(widget_set, key, value)
   File "kivy/weakproxy.pyx", line 35, in kivy.weakproxy.WeakProxy.__setattr__
   File "kivy/properties.pyx", line 497, in kivy.properties.Property.__set__
   File "kivy/properties.pyx", line 1526, in kivy.properties.AliasProperty.set
   File "/home/echologic/.local/lib/python3.7/site-packages/kivy/uix/progressbar.py", line 46, in _set_value
     value = max(0, min(self.max, value))
 TypeError: '<' not supported between instances of 'NoneType' and 'float'
4

1 回答 1

0

您必须使用空值初始化变量:

<CustomMenuCard>
    id: menu_card

    # variables
    label_text: ''
    progress_value: 0
    player_level: ''
于 2020-11-18T21:16:31.870 回答