kivy语言文件root与<root> - 按惯例加载与生成器加载</root>

时间:2014-02-21 20:38:53

标签: python kivy

首先,对于长标题感到抱歉,但我无法想出一个更好的方法来表达我的问题。

您好,我对kivy语言文件中的符号感到有点困惑:根据this文档的第一行,前一种语法表示根项,

rootObj:
    Button:
        ....

而后者表示某种规则:

<rootObj>:
    Button:
        ....

我认为以前的语法描述了我称之为该窗口的根对象作为我的python类,即python-class rootObj应该用作我example.kv的根对象。因此,我不明白括号内语法的目的。但是假设我在目录中有以下文件。

main.py
main.kv

main.py看起来像这样:

def rootObj(Widget):
    pass

def MainApp(App):
    def build(self):
        return rootObj()

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

运行MainApp并按惯例加载main.kv。 Kivy调用MainApp.build()并返回我想成为根对象的实例。为了使这个例子有效,我必须采用后一种方法,即在那些奇怪的<>括号中指定根对象的名称。我想知道,为什么我必须在MainApp.build()执行此操作时指定root-Object的名称。或者我在这里完全错了,kivy采用rootObj()并在.kv-file中附加内容?一些启示会派上用场。

如果我现在将目录结构更改为类似的内容......

 ui     
  \----main.kv     
 main.py

...并将return rootObj()更改为return Builder.load_file("gui/main.kv"),我突然不得不使用无括号语法 - 但我不知道为什么。

有人可以解释一下kivy如何按惯例处理加载并由Builder-object加载的语法和内部的差异?

1 个答案:

答案 0 :(得分:5)

括号内的语法为窗口小部件的行为方式创建规则。此规则将适用于该窗口小部件的任何和每个实例。

例如,您可以在python中创建一个MyButton类并编写kv:

<MyButton>:
    background_color: (1, 0, 0, 1)

现在意味着 MyButton的每个实例,无论何时何地创建它,都会应用此规则 - 在这种情况下,只需将其背景设置为红色。

没有括号的其他语法定义了如何构造类的单个特定实例。额外的指令不适用于该类的任何其他实例,只适用于加载文件时Builder返回的实例。

一个kv文件只能包含一个根小部件声明(没有括号),但它可以包含任意数量的普通规则。

例如,您可以使用类似以下内容的kv文件:

RootObj:
    MyButton:
    MyButton:
    MyButton:

<MyButton>:
    background_color: (1, 0, 0, 1)

<RootObj>:
    Label:
        text: 'label text'

使用构建器加载此项将返回单个RootObj,其中包含 4 子窗口小部件 - 由其常规规则定义的标签,以及3个MyButton实例(根据其规则所有染色为红色) )由特殊根小部件描述创建。