我对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只是被忽略
问题是该行:
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文件中。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。