为什么在使用bind()时在init()中声明的Kivy属性会生成错误?

时间:2017-11-04 03:38:11

标签: python kivy

我正在测试Kivy v1.10.0,并且不明白为什么我设置Kivy属性的位置会产生影响。

此代码有效:

from kivy.app import App
from kivy.properties import ListProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget


class CustomBtn(Widget):
    pressed = ListProperty([0, 0])

    def __init__(self, **kwargs):
        super(CustomBtn, self).__init__(**kwargs)
        # self.pressed = ListProperty([0, 0])

    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            self.pressed = touch.pos
            return True
        return super(CustomBtn, self).on_touch_down(touch)


class RootWidget(BoxLayout):
    def __init__(self, **kwargs):
        super(RootWidget, self).__init__(**kwargs)
        cb = CustomBtn()
        self.add_widget(cb)
        cb.bind(pressed=self.btn_pressed)

    def btn_pressed(self, instance, pos):
        print(pos)


class MyApp(App):
    def build(self):
        return RootWidget()


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

但是,如果我替换当前级别的行:

pressed = ListProperty([0, 0])

CustomBtn.__init__()中的等价物:

self.pressed = ListProperty([0, 0])

我在指令cb.bind(pressed=self.btn_pressed)中收到错误:

File "kivy\_event.pyx", line 438, in kivy._event.EventDispatcher.bind (kivy\_event.c:6500)
KeyError: 'pressed'

我相信在任何方法中声明(分配)类级别的属性,并且在__init__()中执行相同操作是等效的。 Kivy属性不是Python属性,也许构建对象的顺序是不同的,对Kivy有所不同?

1 个答案:

答案 0 :(得分:2)

  

我相信在类级别声明(赋值)一个属性   方法并在__init__()中执行相同操作。

不。 Kivy的属性 - 是描述符(way it works)。存储在类中的描述符对象should be可以工作。它是Python的东西 - 没有什么Kivy具体。