0

我的 Py 文件:

    from kivymd.app import MDApp
    from kivymd.theming import ThemeManager
    from kivy.app import App
    from kivy.uix.video import Video
    

 class MainApp(MDApp):
        def on_start(self):
            # Set colors
            self.theme_cls = ThemeManager()
    
    MainApp().run()

所以这是我的自定义小部件:

<PagesButton@MDRectangleFlatButton>
    canvas:
        Color:
            rgba: 0, 0, 0, 1
        Line:
            width: 4
            ellipse: (self.x, self.y, 120, 120)

    BoxLayout:
        size_hint: None, None
        #pos_hint: {'center': .5, 'top': .5}
        width: 70
        height: 45

    Image:            
        size_hint: None, None
        size: 60, 60
        keep_ratio: False
        allow_stretch: True

这是我尝试使用的上述小部件的一个实例,

        GridLayout:  
            cols: 10
            rows: 1
            size_hint_y:  None
            height: 150
            spacing: 60
            padding: 20, 60, 20, 0


            MDRectangleFlatButton:
                canvas:
                    Color:
                        rgba: 0, 0, 0, 1
                    Line:
                        width: 4
                        ellipse: (self.x, self.y, 120, 120)

                BoxLayout:
                    size_hint: None, None
                    #pos_hint: {'center': .5, 'top': .5}
                    width: 30
                    height: 25

                    Image:
                        source: "Nav_icons/Events.png"
                        size_hint: None, None
                        size: 60, 60
                        keep_ratio: False
                        allow_stretch: True
                        #pos_hint: {'left': .5, 'top': 1.1}


            PagesButton:
                text: 'hey'

现在我理解它的方式......

如果我在我的代码中使用自定义动态类,它是否应该已经拥有我最初定义该类时编写的所有其他属性?

在当前示例中,当我编写 PagesButton 时,我只得到一个中间带有文本“嘿”的常规矩形按钮。我在 PagesButton@MDRectangleFlatButton 中写的所有其他内容都被完全忽略了。

在此处输入图像描述

我的意图是用所有属性定义定义一个广泛的视图类,然后一遍又一遍地使用这个类的实例,每次都进行轻微的调整,比如一个新的图像和新的来源,但广义类中的其他所有东西都会仍然出现。在这个例子中,每次我使用这个类时,我都应该得到一个描边的圆形按钮,里面有一个新的图像。我希望只有在我为每个实例的特定属性定义一个新规则时才会发生变化,否则,一切都应该在视觉上保持不变和一致。

这不是它应该如何工作的吗?还是我做错了什么?

在此处输入图像描述

4

1 回答 1

0

您的动态课程在技术上如您所描述的那样工作。该PagesButton实例将具有您在kv规则中定义的子级。问题是您似乎做出了一些不正确的假设。通常,aWidget不控制其子项的位置或大小。其中包括布局。所以PagesButton它应该被绘制。

Widget 文档中:

  • Widget 不是 Layout:它不会改变其子元素的位置或大小。如果您想控制定位或大小,请使用布局。
  • 小部件的默认大小为 (100, 100)。仅当父级是布局时才会更改。例如,如果您在 Button 内添加标签,则标签不会继承按钮的大小或位置,因为该按钮不是 Layout:它只是另一个 Widget。

pos因此,由于a的默认Widget值为(0,0),因此您的孩子PagesButton将被绘制在(0,0)

您也不能将size_hintorpos_hint用于 的子级PagesButton,因为这些提示是由布局处理的。

不确定您想要的PagesButton外观,但考虑将 aBoxLayout与 aMDRectangleFlatButton作为其子项之一。您可以创建一个扩展BoxLayout(或任何布局)并包含一个Image和一个的动态类MDRectangleFlatButton

于 2020-08-06T21:20:52.020 回答