在我的RootWidget中,我有一个标签和两个按钮。我想在点击其中一个按钮时动态更改标签的文本。
这是我现在如何做的最小工作示例。
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
w = Builder.load_string('''
<RootWidget>:
id: root_widget
Label:
id: label
text: 'Push a button'
Button:
text: '1'
on_press: label.text = self.text
Button:
text: '2'
on_press: label.text = self.text
''')
class RootWidget(BoxLayout):
pass
class MainApp(App):
def build(self):
return RootWidget()
if __name__ == '__main__':
MainApp().run()
显然我想重构一行on_press: label.text = self.text
。我的第一次尝试以
<RootWidget>:
id: root_widget
Label:
id: label
text: 'Push a button'
MyButton:
text: '1'
MyButton:
text: '2'
<MyButton>:
on_press: label.text = self.text
但显然MyButton
- 类并不知道label
- 类的属性RootWidget
。并且不允许类规则中的类规则。
有没有办法动态地绑定on_press
- 动作?
答案 0 :(得分:2)
您可以像这样参考Label
:
<MyButton@Button>:
on_press: self.parent.ids.label.text = self.text
<RootWidget>:
id: root_widget
Label:
id: label
text: 'Push a button'
MyButton:
text: '1'
MyButton:
text: '2'
答案 1 :(得分:2)
实际上非常简单,因为通过kv,您可以使用self.parent
轻松访问小部件/规则的父级,因此您的代码将如下所示:
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
w = Builder.load_string('''
<RootWidget>:
id: root_widget
Label:
id: label
text: 'Push a button'
But:
text: '1'
But:
text: '2'
<But>:
on_press: self.parent.label.text = self.text
''')
class RootWidget(BoxLayout):
pass
class MainApp(App):
def build(self):
return RootWidget()
if __name__ == '__main__':
MainApp().run()