将on_press重构为类规则

时间:2016-03-24 11:53:22

标签: python kivy

在我的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 - 动作?

2 个答案:

答案 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()