在__init__中强制kivy布局

时间:2014-12-15 15:00:09

标签: python kivy

我多次遇到这个问题,所以我的方法不对或错过了一个关键功能。

通常,我最终需要在小部件init方法中设置初始图形信息。这不起作用,因为首次创建kivy图形时,它们位于pos:0, 0size:100, 100。所以init中的任何设置看起来都不正确。

有没有办法强制kivy在小部件init中进行布局?我看到了do_layout,但还没弄明白如何进行布局尝试。

以下是一个例子:

的Python:

class Main(Widget):
    route = ListProperty([])

    def __init__(self, *args, **kwargs):
        super(Main, self).__init__(**kwargs)
        self.route = [0, 0, self.width, self.height]


class RouteBuilderApp(App):
    def build(self):
        main = Main()
        return main

if __name__ == "__main__":
    RouteBuilderApp().run()

的Kv:

<Main>
    canvas:
        Color:
            rgb: 0, 0, 0
        Rectangle:
            size: self.size
            pos: self.pos
        Color:
            rgb: 0, 0, 1
        Line: 
            points: root.route
            width: 2

输出:

enter image description here

1 个答案:

答案 0 :(得分:1)

您需要使用属性绑定。这在kv语言中非常简单,你可以像这样改变你的kv:

canvas:
    Color:
        rgb: 0, 0, 0
    Rectangle:
        size: self.size
        pos: self.pos
    Color:
        rgb: 0, 0, 1
    Line: 
        points: 0, 0, root.width, root.height
        width: 2

通过直接绑定Line的点,您甚至不需要中间route属性。