【问题标题】:Instantiation of Kivy Children Widgets between Python and Kivy Language在 Python 和 Kivy 语言之间实例化 Kivy Children Widget
【发布时间】:2018-08-04 22:12:49
【问题描述】:

我在让 Kivy 实例化子小部件时遇到问题。我认为这里的问题是我如何设置根小部件。根据我看到的许多示例,包括 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 类规则:

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

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    空白窗口/应用程序

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

    • 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 应用程序 - 带有 kv 文件

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

    问题 2

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

    回答 2

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

    问题 3

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

    答案 3

    我不相信会有任何不可预见的后果。在 kv 文件中使用 root ruleclass rule 时唯一需要注意的事项如下。

    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 文件中,您定义了一个类规则,即&lt;Root_Widget&gt;:,那么在您的 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()
    

    【讨论】:

    • 感谢 ikolim!你的回答很有帮助。我编辑了这个问题,因为我在 .kv 文件中为 Test_Screen 定义的标签和按钮和东西我只是没有包含它以使问题更简洁。无论如何,答案 3 的选项 1 解决了我在尝试使用 .kv 文件中的根规则时看到的黑屏问题。所以,现在我可以使用所有不同的实例化技术
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多