Kivy嵌套BoxLayout在左下角堆叠小部件

时间:2017-09-15 13:09:15

标签: python kivy kivy-language

我正在尝试动态构建一个带有垂直BoxLayout的Kivy布局,其中包含可在运行时更改的不同数量的自定义MyRow小部件。 layout example 每一行都是一个水平的BoxLayout

我没有使用GridLayout,因为正在开发MyRow布局,并且可以在不久的将来更改添加小部件等。例如此示例 layout example 2

但是使用下面的代码我只会在窗口的左下角将小部件叠放在一起。

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty

class MyRow(Widget):
    a = StringProperty('a')
    b = StringProperty('b')

    def __init__(self, **kwargs):
        super(MyRow, self).__init__(**kwargs)

class MainScreen(Widget):

    rows = [['a1','b1'],['a2','b2']] #example data

    mainLayout = BoxLayout(orientation='vertical', spacing=5)

    def __init__(self, **kwargs):
        super(MainScreen, self).__init__(**kwargs)

        self.add_widget(self.mainLayout)

        for r in self.rows:
            row_widget = MyRow()

            row_widget.a = r[0]
            row_widget.b = r[1]

            self.mainLayout.add_widget(row_widget)

class MyApp(App):

    def build(self):
        return MainScreen()

if __name__ == '__main__':
    MyApp().run()

这是kv文件:

<MyRow>
    BoxLayout:
        orientation: "horizontal"
        spacing: 30
        Label:
            id: a_label
            text: root.a
        Label:
            id: b_label
            text: root.b

1 个答案:

答案 0 :(得分:1)

在草图中,MyRow表示基于水平BoxLayout。但事实并非如此。它建立在widget

之上

简单地改变

class MyRow(Widget):

class MyRow(BoxLayout):

将解决您的问题。

enter image description here

为了获得正确或更好的间距,我会将您的代码更新为以下

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
from kivy.base import Builder



class MyRow(BoxLayout):
    a = StringProperty('a')
    b = StringProperty('b')

    def __init__(self, **kwargs):
        super(MyRow, self).__init__(**kwargs)

class MainScreen(BoxLayout):

    rows = [['a1','b1'],['a2','b2']]*5 

    def __init__(self, **kwargs):
        super(MainScreen, self).__init__(**kwargs)
        self.orientation = "vertical"

        for r in self.rows:
            row_widget = MyRow()

            row_widget.a = r[0]
            row_widget.b = r[1]

            self.add_widget(row_widget)



class MyApp(App):

    def build(self):
        return MainScreen()

if __name__ == '__main__':
    MyApp().run()

和你的kv

<MyRow>:
    orientation: "horizontal"
    spacing: 30
    Label:
        id: a_label
        text: root.a
    Label:
        id: b_label
        text: root.b

为您提供enter image description here

要从python中的Boxlayot继承,请在kv文件中使用class Row(BoxLayout):使用<Row@BoxLayout>: