我正在测试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有所不同?
答案 0 :(得分:2)
我相信在类级别声明(赋值)一个属性 方法并在
__init__()
中执行相同操作。
不。 Kivy的属性 - 是描述符(way it works)。存储在类中的描述符对象should be可以工作。它是Python的东西 - 没有什么Kivy具体。