2016-04-29 2 views
1

Иногда 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 знает, как поднять событие при изменении длины списка.

Для этого, я думаю, мне нужно создать подкласс PropertyPointProperty.

Но я не нашел документацию о том, как это сделать. Помощь была бы оценена.

ответ

0

Для этого вам не нужно создавать новый тип свойства; строить большие вещи из мелочей. Сделайте эти x и y числовыми свойствами.

class Point(EventDispatcher): 

    x = NumericProperty(0) 
    y = NumericProperty(0) 

    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def on_x(self, obj, value): 
     print 'x changed:', value 

    def on_y(self, obj, value): 
     print 'y changed:', value 

Тогда

w = MyWidget(Point(0, 0)) 
w.point.x = 10 
# 'x changed: 10' 
+0

Хорошая идея, но это еще не совершенны. Что делать, если я использую сторонние классы, которые не связаны с Kivy? Кроме того, я использую Kivy 'Vector' класс, который не построен таким образом (вот что привело меня к этому вопросу). –

+0

@zeeMonkeez Спасибо за указание этого. – jligeza

+0

@AvivCohn Бессмысленно отслеживать изменения всего * объекта *, потому что это добавит много ненужных вычислений, замедляя ваше приложение. Я не знаю, что именно вы пытаетесь сделать, пытаясь отслеживать все поля на внешнем объекте класса; но в любом случае вы можете просто обернуть его. – jligeza

 Смежные вопросы

  • Нет связанных вопросов^_^