首页 > 解决方案 > python kivy Boxlayout没有组织它的孩子

问题描述

我正在创建一个简单的 Database-GUI,并希望在表单中添加两行。每行都是一个 DataField-Object,包含一个标签和一个由水平 Boxlayout 组织的 TextInput。到这里一切都好。Form-Widget 还包含一个 BoxLayout(Orientaton:“Vertical”),通过将两个 DataField-Objects 相互列出来组织它们,但它不起作用......我的问题:为什么?我该如何解决?

dbgui3.py

from kivy import require
require("2.0.0")

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import StringProperty, ObjectProperty

class DataField(Widget):
    title = StringProperty()
    pass

class Form(Widget):
    b = ObjectProperty()

    def __init__(self, *rec, **kwargs):
        super().__init__()
        for df in rec:
            self.b.add_widget(DataField(title=df))

class DbGui3(App):
    def build(self):
        return Form("hello", "world")

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

dbgui3.kv

<DataField>:
    text: txt.text

    BoxLayout:
        orientation: "horizontal"
        size_hint: None, None
        size: root.width, 30
        canvas:
            Color:
                rgb: 0.2,0.2,0.2
            Rectangle:
                size: self.size

        Label:
            text: root.title
            size_hint: None, 1
            width: self.texture_size[0]

        TextInput:
            id:txt
            multiline: False
            on_text_validate: print("text validated:" + root.text)
<Form>:
    b:b
    BoxLayout:
        id: b
        orientation: "vertical"
        size_hint: None, None
        size: root.width, root.height
        canvas:
            Color:
                rgb: 0.1,0.2,0.3
            Rectangle:
                size: self.size

标签: pythonkivy

解决方案


问题是您正在Widget用作您的DataField和类的基Form类。该类Widget不会注意到size_hint,pos_hint和其他内容。它不打算成为Layout. 我建议你使用BoxLayout作为你的基础DataField和其他一些Layout(也许FloatLayout)作为Form. 使用此建议,您的类定义可能是:

class DataField(BoxLayout):
    title = StringProperty("example")

class Form(FloatLayout):
    pass

然后修改你的kv

<DataField>:
    size_hint: 1, None
    height: 30
    orientation: "horizontal"

    Label:
        size_hint: None, None
        size: self.texture_size[0]*1.3, root.height
        text: root.title

    TextInput:
        multiline: False
        on_text_validate: print(root.title)

<Form>:
    BoxLayout:
        orientation: "vertical"
        size_hint: None, None
        size: root.width/2, root.height/2
    
        DataField:
            title: "hello"
    
        DataField:
            title: "world"

我认为这会做你想要的。


推荐阅读