Python-Kivy:具有拉伸功能的BoxLayout

时间:2018-08-21 20:27:57

标签: python kivy

如何根据动态添加的内容扩展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的大小就不会改变并且文本会叠加。

预先感谢您的帮助。

1 个答案:

答案 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。但是,如您所见,计算布局时,标签的高度会减小以适合BoxLayoutLabel的纹理可以在布局之前进行更新,因此,我在计算中使用了它的高度。这将减小添加了第一个BoxLayout的{​​{1}}的大小,并在以后的每个添加中增大它的大小。请注意,这仅适用于具有Labeltexture之类的Label属性的小部件。