【问题标题】:How to set a custom widget size/position to it's parent layout in kivy?如何在 kivy 中将自定义小部件大小/位置设置为其父布局?
【发布时间】:2019-07-13 22:03:23
【问题描述】:

我正在尝试将自定义小部件添加到 GridLayout,但大小和位置不会动态缩放以适应父布局。我的目标是通过按下按钮将这些 CustomWidgets 之一添加到 GridLayout。如果我将 .kv 文件的 <CustomWidgets> 类的内容直接复制并粘贴到 .kv GridLayout(左图)中,我能够实现我想要的结果,但这回避了按钮的目的。

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

我的猜测是,如果在将 '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

【问题讨论】:

  • size_hint 是父母大小的一小部分,所以它应该是一个从 0 到 1 的数字。

标签: python kivy


【解决方案1】:

我认为如果你有 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 时,所包含StackLayoutsize_hint 表示其父级的一部分,即CustomWidgets 本身。而Widget 类忽略size_hint,只有Layout 类和Window 使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多