2016-03-24 2 views
1

В моем RootWidget у меня есть метка и две кнопки. Я хочу динамически изменять текст метки всякий раз, когда нажимается одна из кнопок.Рефактор on_press в правиле класса

Вот минимальный рабочий пример того, как я это делаю в данный момент.

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

Вы можете обратиться к Label как это:

<[email protected]>: 
    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' 
2

Это довольно просто на самом деле, потому что через кв вы можете получить доступ к родителю виджета/правило легко с 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() 
+0

haha, 8 секунд медленнее;) – zeeMonkeez

+0

Забавный, я думаю, что до сих пор со мной так и не дошло. Я пропускаю ответы на вопросы с комментариями/ответами. : D – KeyWeeUsr

+1

Этот был низко висящий фрукт :) – zeeMonkeez

Смежные вопросы