我在让Kivy实例化儿童Widget时遇到问题。我认为这里的问题与我如何设置根窗口小部件有关。根据我看到的许多示例,包括kivy自己的documentation,我应该能够将子窗口小部件实例化为.kv文件中的根窗口小部件,而无需像这样使用<>:
initApp.kv root_rule:
Root_Widget:
Test_Screen:
<Test_Screen>:
BoxLayout:
*there is stuff here, leaving blank to keep this question shorter*
Python文件:(请注意,add_widget()已被注释掉)
class Test_Screen(Screen):
pass
class Root_Widget(ScreenManager):
def __init__(self, **kwargs):
super().__init__(**kwargs)
# self.add_widget(Test_Screen())
pass
class InitApp(App):
def build(self):
return Root_Widget()
if __name__ == '__main__':
InitApp().run()
但是,这只会导致应用空白。有两种方法可以解决此问题:
initApp.kv class_rule:
<Root_Widget>:
Test_Screen:
<Test_Screen>:
BoxLayout:
*there is stuff here, leaving blank to keep this question shorter*
问题
我的问题是,这有什么区别?在.kv文件中的Root_Widget下嵌套Test_Screen应该与正确调用add_widget()方法完全相同吗?这是真的吗?如果是这样,将Root_Widget设置为类规则VS时,为什么/为什么不同?根本规则?
说Root_Widget是类规则而不是根规则是否有无法预料的后果?使用这种方法似乎可以正常工作,但是我不知道随着应用程序变得更加复杂,是否还会引起其他麻烦。
答案 0 :(得分:2)
空白的窗口/应用可能是由于以下原因之一:
class InitApp(App):
,则kv文件名应为init.kv
。如果您未使用 Builder 加载kv,则kv文件名应为 init.kv 而不是 InitApp.kv kv filename - By name convention
按名称惯例
Kivy在以下位置查找与您的App类同名的Kv文件 小写字母,如果以“ App”结尾则减去“ App”,例如:
MyApp -> my.kv
实例化并在Test_Screen下添加Label小部件,如下所示:
<Test_Screen>:
BoxLayout:
Label:
text: "kv file - Root Rule vs Class Rule"
这里有什么区别?在下面嵌套Test_Screen kv文件中的Root_Widget应该与调用 add_widget()方法正确吗?
是的。
add_widget(Test_Screen())
函数实例化父项下的添加子项小部件。 Test_Screen:
实例化并在父项下添加子项add_widget(Button())
动态实例化子控件并将其添加到ScrollView。这是真的吗,如果是的话,设置时如何/为什么不同 Root_Widget作为VS的类规则。根本规则?
解析kv文件时,根规则将设置为App实例的根属性。而类规则定义了如何以图形方式表示该类的任何实例。
说Root_Widget是类规则而不是根规则是否有无法预料的后果?
我不认为有任何不可预见的后果。在kv文件中使用 根规则 或 类规则 时,要注意的唯一事项如下。
如果在kv文件中定义了根规则,即Root_Widget:
,那么在Python代码中,您可以执行以下操作之一:
kv文件为 init.kv
class InitApp(App):
pass
kv文件不是 init.kv ,而是 InitApp.kv
class InitApp(App):
def build(self):
return Builder.load_file("InitApp.kv")
如果您在kv文件中定义了一个类规则,即<Root_Widget>:
,那么在您的Python代码中,您可以执行以下操作之一:
kv文件为 init.kv
class InitApp(App):
def build(self):
return Root_Widget()
kv文件不是 init.kv ,而是 InitApp.kv
class InitApp(App):
def build(self):
Builder.load_file("InitApp.kv")
return Root_Widget()