我正在尝试动态构建一个带有垂直BoxLayout的Kivy布局,其中包含可在运行时更改的不同数量的自定义MyRow
小部件。
每一行都是一个水平的BoxLayout
我没有使用GridLayout,因为正在开发MyRow
布局,并且可以在不久的将来更改添加小部件等。例如此示例
但是使用下面的代码我只会在窗口的左下角将小部件叠放在一起。
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
答案 0 :(得分:1)
在草图中,MyRow
表示基于水平BoxLayout。但事实并非如此。它建立在widget
简单地改变
class MyRow(Widget):
到
class MyRow(BoxLayout):
将解决您的问题。
为了获得正确或更好的间距,我会将您的代码更新为以下
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
要从python中的Boxlayot继承,请在kv文件中使用class Row(BoxLayout):
使用<Row@BoxLayout>: