Python框架Kivy没有注意到扩展名为.kv的文件-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

Python框架Kivy没有注意到扩展名为.kv的文件

祖安文状元 2020-02-22 17:51:37 164

我对Kivy框架有疑问。我在文件main.py中定义了父类和子类。另外,我在文件my.kv中定义了子类,并向他添加了两个小部件(标签和按钮)

main.py

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import ObjectProperty 

class MyApp(App):
    pass

class Child(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

class Parent(BoxLayout):

    obj = ObjectProperty(Child())

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.add_widget(self.obj)


if __name__ == '__main__':
    MyApp().run()

我的kv

Parent:

<Child>:
    Label:
        text: "Some text"
    Button:
        text: "Button"

我将子类定义为父类的属性,并在初始化期间将其添加到父类。但是启动程序后,我没有看到以前添加的小部件(标签和按钮)。我看到的只是空的小部件。好像文件my.kv只是被忽略

Python
分享到
取消 提交回答
全部回答(1)
  • 祖安文状元
    2020-02-22 17:51:53

    问题是该行:

    obj = ObjectProperty(Child())
    
    

    在my.kv文件加载之前进行评估,因此此时没有规则将a Label和a 添加Button到Child实例。这导致Child实例为空BoxLayout。当MyApp启动时,它然后加载my.kv文件,并创建Parent实例为根小部件。它还会加载 规则,但这对Child存储在obj属性中的已创建实例没有影响。

    这可以通过许多不同的方式来解决。一种是Child直到my.kv文件加载后才创建实例。像这样:

    class Parent(BoxLayout):
    
        obj = ObjectProperty(None)   # initialize the obj to None
    
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
    
            # create the Child instance now
            self.obj = Child()
    
            self.add_widget(self.obj)
    
    

    另一种方法是仅将Childas作为子文件包含Parent在my.kv文件中。

    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程