Разберитесь в связывании в киве - PullRequest
1 голос
/ 22 июня 2019

Я хочу больше узнать о методе связывания

Я не могу понять, почему этот код не работает (я сокращаю свою проблему до этого, чтобы помочь мне понять причину), большое спасибо за ваше время

from kivy.app import App
from kivy.uix.gridlayout import GridLayout


class Game(GridLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.a = 0

        self.bind(a=self.f)

    def f(self, *args):
        print("ok")


class TestApp(App):
    def build(self):
        self.game = Game()
        return self.game


if __name__ == "__main__":
    TestApp().run()
Traceback (most recent call last):
    File "test2.py", line 23, in <module>
        TestApp().run()
    File "C:\Users\Legion\AppData\Local\Programs\Python\Python37-32\lib\site-packages\kivy\app.py", line 829, in run
        root = self.build()
    File "test2.py", line 18, in build
        self.game = Game()
    File "test2.py", line 10, in __init__
        self.bind(a=self.f)
    File "kivy\_event.pyx", line 427, in kivy._event.EventDispatcher.bind
KeyError: 'a'

1 Ответ

0 голосов
/ 22 июня 2019

Если проверено документов :

bind (** kwargs)
Привязать тип события или свойство к обратному вызову

(выделение добавлено)

Как отмечается, это указывается свойством, которое отличается от атрибутов класса.

Итак, используя ваш код в качестве основы и добавляя функциональность для изменения значения каждую секунду:

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.properties import NumericProperty
from kivy.clock import Clock

class Game(GridLayout):
    a = NumericProperty(0)

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        self.bind(a=self.f)

    def f(self, *args):
        print("ok")


class TestApp(App):
    def build(self):
        Clock.schedule_interval(self.foo, 1)
        self.game = Game()
        return self.game

    def foo(self, dt):
        self.game.a += 1


if __name__ == "__main__":
    TestApp().run()

И почему используются Свойства ?

Поскольку свойства этого типа хранят связанные обратные вызовы (например, в примере вызываемый f), а затем при изменении его значения вызывают все обратные вызовы, с которыми он имеет привязку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...