首先,对于长标题感到抱歉,但我无法想出一个更好的方法来表达我的问题。
您好,我对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加载的语法和内部的差异?
答案 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
实例(根据其规则所有染色为红色) )由特殊根小部件描述创建。