开发者社区> 问答> 正文

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

我对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只是被忽略

展开
收起
祖安文状元 2020-02-22 17:51:37 707 0
1 条回答
写回答
取消 提交回答
  • 问题是该行:

    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文件中。

    2020-02-22 17:51:53
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载