Python和Kivy语言之间的Kivy儿童小部件实例化

时间:2018-08-03 15:52:29

标签: python kivy

我在让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()

但是,这只会导致应用空白。有两种方法可以解决此问题:

  1. 取消注释 self.add_widget(Test_Screen())行或
  2. 在.kv文件中的Root_Widget周围添加<>,这样它将成为一个类规则:

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是类规则而不是根规则是否有无法预料的后果?使用这种方法似乎可以正常工作,但是我不知道随着应用程序变得更加复杂,是否还会引起其他麻烦。

1 个答案:

答案 0 :(得分:2)

空白窗口/应用

空白的窗口/应用可能是由于以下原因之一:

  • kv文件名不匹配,例如应用类名称class InitApp(App):,则kv文件名应为init.kv。如果您未使用 Builder 加载kv,则kv文件名应为 init.kv 而不是 InitApp.kv
  • return 语句中没有根窗口小部件
  • kv文件中没有root rule

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"

问题1

  

这里有什么区别?在下面嵌套Test_Screen   kv文件中的Root_Widget应该与调用   add_widget()方法正确吗?

答案1

是的。

Kivy应用-没有kv文件

  • 使用add_widget(Test_Screen())函数实例化父项下的添加子项小部件。

Kivy App-带有kv文件

  • 使用Test_Screen:实例化并在父项下添加子项
  • 可以同时使用使用add_widget(Button())动态实例化子控件并将其添加到ScrollView。

问题2

  

这是真的吗,如果是的话,设置时如何/为什么不同   Root_Widget作为VS的类规则。根本规则?

答案2

解析kv文件时,根规则将设置为App实例的根属性。而类规则定义了如何以图形方式表示该类的任何实例。

问题3

说Root_Widget是类规则而不是根规则是否有无法预料的后果?

答案3

我不认为有任何不可预见的后果。在kv文件中使用 根规则 类规则 时,要注意的唯一事项如下。

kv文件-使用根规则

如果在kv文件中定义了根规则,即Root_Widget:,那么在Python代码中,您可以执行以下操作之一:

选项1

kv文件为 init.kv

class InitApp(App):
    pass

选项2

kv文件不是 init.kv ,而是 InitApp.kv

class InitApp(App):

    def build(self):
        return Builder.load_file("InitApp.kv")

kv文件-使用类规则

如果您在kv文件中定义了一个类规则,即<Root_Widget>:,那么在您的Python代码中,您可以执行以下操作之一:

选项1

kv文件为 init.kv

class InitApp(App):

    def build(self):
        return Root_Widget()

选项2

kv文件不是 init.kv ,而是 InitApp.kv

class InitApp(App):

    def build(self):
        Builder.load_file("InitApp.kv")
        return Root_Widget()