Классы с раскладкой киви

Я хочу определить виджет, используя язык kivy, но затем я хочу добавить функции в класс. Ниже приведена моя наивная попытка, которая терпит неудачу, когда я нажимаю кнопку с сообщением «AttributeError: объект 'MyButton' не имеет атрибута 'second_pressed'»
Как мне сделать класс с функциями и определенным языком kivy?

import sys
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout

root = Builder.load_string('''
BoxLayout:
    Label:
        text: 'hello'
    MyButton:

<MyButton@Button>:
    text: 'Second button'
    on_press: self.second_pressed()
''')

class MyButton():
    def second_pressed():
        print "second pressed"
        sys.stdout.flush()

class Tryit(App):
    def build(self):
        return root

if __name__ == '__main__':
    Tryit().run()

person rich    schedule 20.12.2016    source источник


Ответы (1)


<MyButton@Button>:

Это определяет новый класс динамически с именем MyButton, который не имеет отношения к MyButton в вашем коде Python, для которого вы добавили этот метод.

Чтобы заставить его работать, вместо этого напишите просто <MyButton>:, что обозначает правило для существующего класса. Вам также может потребоваться отложить Builder.load_string до тех пор, пока этот класс не будет объявлен - обычно лучше сделать это в методе build приложения, поскольку на этом этапе гарантируется инициализация всего важного.

person inclement    schedule 20.12.2016