Иногда ObjectProperty
не подходит. Это происходит потому, что оно вызывает только событие, когда изменяется значение объекта.Есть ли способ создания пользовательских свойств в Kivy?
Но как изменится атрибут объекта? Событие не поднимается.
Рассмотрим класс:
class Point(object):
def __init__(self, x, y):
self.x = x
self.y = y
И виджет Kivy:
class MyWidget(Widget):
point = ObjectProperty()
def __init__(self, point):
super(MyWidget, self).__init__()
self.point = point
def on_point(self, obj, value):
# do something
Что происходит, когда я что-то изменить point
?
w = MyWidget(Point(0, 0))
w.point.x = 10
# callback not called!
Обратный вызов не был вызван, потому что, насколько ObjectProperty
обеспокоен, point
не изменилось. Но я хочу, чтобы изменения в x
и y
учитывались как изменения и поднимали событие.
Как и в случае с ListProperty
знает, как поднять событие при изменении длины списка.
Для этого, я думаю, мне нужно создать подкласс Property
PointProperty
.
Но я не нашел документацию о том, как это сделать. Помощь была бы оценена.
Хорошая идея, но это еще не совершенны. Что делать, если я использую сторонние классы, которые не связаны с Kivy? Кроме того, я использую Kivy 'Vector' класс, который не построен таким образом (вот что привело меня к этому вопросу). –
@zeeMonkeez Спасибо за указание этого. – jligeza
@AvivCohn Бессмысленно отслеживать изменения всего * объекта *, потому что это добавит много ненужных вычислений, замедляя ваше приложение. Я не знаю, что именно вы пытаетесь сделать, пытаясь отслеживать все поля на внешнем объекте класса; но в любом случае вы можете просто обернуть его. – jligeza