如何覆盖Kivy小部件的子级的默认值?即MyWidget.label
为“默认”,但我想将其更改为例如MyRootWidget
的孩子时是“紫色乌龟”?
我可以像在MyRootWidget.__init__()
中一样访问孩子的孩子,但是这似乎很麻烦,尤其是对于一棵深树……这样做是否更优雅? p>
我一直在查看Kivy lang和Widget页面,但如果有解决方案,则无法理解。我在SO页面中还没有看到这个问题(尽管我在搜索时确实回答了一个不同的问题)。
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty, StringProperty
root = Builder.load_string('''
<MyWidget@BoxLayout>:
orientation: 'vertical'
Label:
id: label
text: 'DEFAULT'
<MyRootWidget@BoxLayout>:
id: root_widget
MyWidget:
id: w1
# (---1---)
''')
class MyRootWidget(BoxLayout):
w1 = ObjectProperty()
def __init__(self, **kwargs):
super().__init__(**kwargs)
print(self.ids.w1.ids.label.text) # (---2---)
class MainApp(App):
def build(self):
return MyRootWidget()
if __name__ == '__main__':
MainApp().run()
答案 0 :(得分:1)
首先,在实现任何代码之前,必须设计您的类。
首先,我们将使用MyWidget进行处理,在您的要求中,您指示您希望文本是可修改的,因此它必须是根属性。
MyWidget
┌--------------------------┐
| |
| ┌-------------┐ text---┼--->
| | Label | | |
| | *text ---┼-----┘ |
| └-------------┘ |
└--------------------------┘
使用MyRootWidget也可以这样做:
MyRootWidget
┌-----------------------------┐
| |
| ┌-------------┐ obj_widget--┼--->
| | MyWidget --┼-----┘ |
| | | |
| └-------------┘ |
└-----------------------------┘
属性的深度取决于您的要求,但是如果我们观察到公开一个属性,则意味着在根中创建一个属性并进行绑定,以便在修改根属性时也可以修改内部属性。
实施以上操作,您将获得以下内容:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty, StringProperty
root = Builder.load_string('''
<MyWidget@BoxLayout>:
text: "DEFAULT"
obj_label: label
orientation: 'vertical'
Label:
id: label
text: root.text
<MyRootWidget@BoxLayout>:
obj_widget: w1
MyWidget:
id: w1
text: "purple turtle"
''')
class MyRootWidget(BoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
print(self.obj_widget.text)
class MainApp(App):
def build(self):
return MyRootWidget()
if __name__ == '__main__':
MainApp().run()
因此,为了避免使用id,您可以像创建wid的obj_widget一样为子代小部件创建别名。
根据设计,您不应直接访问完整的树,而必须修改层的属性,如果该层被修改,则必须更新其内部的必要数据,从而避免类之间的耦合。