如何在猕猴桃中为其父布局设置自定义窗口小部件尺寸/位置?

时间:2019-07-13 22:03:23

标签: python kivy

我正在尝试向GridLayout添加自定义窗口小部件,但是其大小和位置不能动态缩放以适应父布局。我的目标是通过按一个按钮将其中一个CustomWidgets添加到GridLayout中。如果将.kv文件的<CustomWidgets>类的内容直接复制并粘贴到.kv GridLayout(左图)中,则可以达到所需的结果,但这避开了按钮的用途。

我已经链接了一张图片,以帮助阐明我的预期结果与实际结果。左图显示了按三下“添加活动”按钮的预期结果。右图显示了当我尝试通过按三次“添加活动”按钮来添加自定义窗口小部件时的实际结果。

enter image description here

我的猜测是,如果将'size_hint_x:self.x'添加到GridLayout之后设置,则可以解决此问题。我试图通过在构建后进行设置来设置CustomWidget'size_hint_x'以使其适合.kv GridLayout中的父布局。

    CustomWidgets:
        size_hint_x: self.x

没有运气。我可以将数字值设置为CustomWidget的宽度,但是然后它不会动态更改以适合窗口的大小。

DemoApp.py

class CustomGridLayout(GridLayout):

    def add_list_item(self):
        print("add list item - CustomGridLayout")
        self.ids['list_layout'].add_widget(CustomWidgets())
    pass

class CustomWidgets(Widget):
    pass

class DemoApp(App):
    def build(self):
        underlying_layout = CustomGridLayout()
        return underlying_layout

if __name__ == "__main__":
    DemoApp().run()

demo.kv

<CustomGridLayout>:
    id: underlying_layout
    orientation: 'vertical'
    cols: 1
    row: 2

    ScrollView:
        GridLayout: #<- This is the GridLayout I want to add custom widgets to
            id: list_layout
            cols: 1
            height: self.minimum_height
            row_default_height: 60
            size_hint_y: None
            Label:
                height: 20
                text: 'List:'

    AnchorLayout:
        size_hint_y: .4
        Button:
            text: 'Add List Item'
            on_press: root.add_list_item()

<CustomWidgets>
    StackLayout:
        cols: 3
        rows: 1
        orientation: 'lr-tb'
        #size_hint: self.x , None   #<-- Is there a size_hint I can provide that will adjust size once widget is added?
        height: 80
        Button:
            size_hint: .25, None
        TextInput:
            size_hint: .5, None
        Button:
            size_hint: .25, None

1 个答案:

答案 0 :(得分:0)

我认为,如果您将CustomWigets扩展StackLayout而不是包含StackLayout会更好,就像这样:

class CustomWidgets(StackLayout):
    pass

然后,在您的kv文件中:

<CustomWidgets>
    orientation: 'lr-tb'
    size_hint: 1.0 , None   #<-- Is there a size_hint I can provide that will adjust size once widget is added?
    height: 80
    Button:
        size_hint: .25, None
    TextInput:
        size_hint: .5, None
    Button:
        size_hint: .25, None

size_hint: 1.0 , None将使CustomWidgets的宽度等于其父宽度。

当您的CustomWidgets扩展Widget并包含StackLayout时,包含的size_hint中的StackLayout表示其父级的一部分,即CustomWidgets本身。 Widget类将忽略size_hint,只有Layout类和Window使用它。