如何根据动态添加的内容扩展BoxLayout? 这是我的代码来说明我正在尝试做的事情:
main.py
from kivy.app import App
from kivy.uix.label import Label
class TestApp(App):
def add_label(self):
label = Label(text='StackOverflow', color=(0,0,0,1))
self.root.ids.myBox.add_widget(label)
if __name__ == '__main__':
TestApp().run()
test.kv
BoxLayout:
orientation: 'vertical'
spacing: 400
BoxLayout:
orientation: 'vertical'
size_hint: None, None
size: dp(280), dp(100)
pos_hint: {'center_x': 0.5, 'center_y': 0.5}
#width: self.minimum_width
#height: self.minimum_height
id: myBox
background_color: (1,1,1,1)
canvas.before:
Color:
rgba: self.background_color
Rectangle:
pos: self.pos
size: self.size
Button:
text: 'BUTTON'
size_hint: None, None
size: dp(100), dp(50)
pos_hint: {'center_x': 0.5, 'center_y': 0.1}
on_release: app.add_label()
按钮具有将标签动态添加到框布局的作用。但是添加的标签越多,BoxLayout的大小就不会改变并且文本会叠加。
预先感谢您的帮助。
答案 0 :(得分:0)
一种执行此操作的方法是自己重新计算BoxLayout
的大小。通过将add_label()
方法更改为:
def add_label(self):
label = Label(text='StackOverflow', color=(0,0,0,1))
self.root.ids.myBox.add_widget(label)
label.texture_update()
boxlayout = self.root.ids.myBox
height = 0
for child in boxlayout.children:
height += child.texture_size[1]
height += 2 * child.padding_y
boxlayout.height = height
BoxLayout
每次更改Label
时都会改变高度。您可能会认为可以在计算中使用child.height
,但是在实际计算布局之前,height的默认值始终为100。但是,如您所见,计算布局时,标签的高度会减小以适合BoxLayout
。 Label
的纹理可以在布局之前进行更新,因此,我在计算中使用了它的高度。这将减小添加了第一个BoxLayout
的{{1}}的大小,并在以后的每个添加中增大它的大小。请注意,这仅适用于具有Label
或texture
之类的Label
属性的小部件。