它实际上不仅显示最后一个按钮-它显示每个按钮,而是在相同的位置。问题是Button不是布局,因此不会执行其子级的布局。因此,每个按钮的GridLayout呈现在0, 0处,大小为100, 100,相对于最近的相对父对象的原点(在本例中,GridLayoutgrid_l,因为它包含在ScrollView中)。在
当您向非布局小部件添加小部件时,您可以通过设置位置和大小来布局这些小部件。请注意,您必须设置实际的pos(或x和{})和{}(或{}和{})-不能使用pos_hint或{},因为它们只由布局处理。在:
image_source: ''
subtext: ''
GridLayout:
height: self.parent.height # match the button's height
width: 100 # set to whatever you would like
pos: self.parent.pos # match the button's position
cols: 1
Image:
source: root.image_source
Label:
text: root.subtext
要使用动态类,您需要导入^{}:
^{pr2}$
然后,在循环中:for i in range(3):
btn = Factory.CustomButton(text=str(i), size_hint=(1, None),
image_source='kivy.png', subtext='label')
grid.add_widget(btn)
最后,需要注意的是:每次调用grid_l时,都会在grid_l上创建新的绑定。这些绑定只能创建一次。您可以通过将这些绑定移动到HomeScreen.__init__()在Python中绑定一次,但同样,在kv中这更容易:GridLayout:
id: gridlayoutID
cols: 1
size_hint: 1, None
row_default_height: 40
row_force_default: False
height: self.minimum_height # bind height to minimum_height
width: self.minimum_width # bind width to minimum_width