我正在尝试向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
答案 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
使用它。