Traits-Enaml: Наблюдение за изменениями черт в модели Atom
Я пишу приложение, используя библиотеку Traits-Enaml. Большая часть моего приложения написана на Atom, за исключением некоторых классов, которые должны отображать графики Чако. Эти классы наследуются от HasTraits. Пример:
def SomeClass(HasTraits):
some_attr = Any() # Attribute that changes on interaction with plot
plot = Plot() # Chaco plot
Каждый из этих экземпляров SomeClass имеет график Чако, с которым пользователь может взаимодействовать. Они отображаются в моем пользовательском интерфейсе с помощью виджета TraitsView. Если пользователь щелкает точку на графике, это вызывает изменение какой-либо черты экземпляра Someclass.
Моя модель (на основе Atom) содержит экземпляры SomeClass и список экземпляров SomeClass.
def Model(Atom):
ex = Typed(SomeClass) # SomeClass instance
l = ContainerList(Typed(SomeClass)) # List of SomeClass instances
Исходя из этого, у меня есть два вопроса:
1) Как я могу наблюдать изменения в someclass_instance из моей модели Atom?
Когда пользователь взаимодействует с любым из графиков, я хочу вызвать вызов функции в моей модели. Если SomeClass наследовал бы от Atom, я мог бы использовать @observe для прослушивания изменений и выполнять вызов функции каждый раз, когда наблюдаемый атрибут изменяется:
@observe('ex.some_attr')
def change_occurred(self,change):
print "ex.some_attr changed"
self.do_stuff()
Однако @observe требует, чтобы наблюдаемый атрибут был членом Atom. Черты в SomeClass, очевидно, не являются членами Atom, так как я могу решить эту проблему? Предоставляет ли Traits-Enaml какие-либо инструменты для прослушивания изменений в объектах HasTraits из объектов Atom?
В качестве альтернативы, есть лучший способ решить эту проблему?
2) Как бы я наблюдал за изменениями в атрибутах любого из элементов в списке?
Если наблюдение, как описано в вопросе выше, возможно, как я буду наблюдать изменения в любом из элементов списка? В чертах я заметил бы изменения в любом из пунктов списка следующим образом:
def AnotherClass(HasTraits):
some_attr = List(Instance(SomeClass)) # List of SomeClass instances which have some trait that changes during runtime.
Однако я не мог понять, как прислушиваться к изменениям в характеристиках какого-либо конкретного элемента в списке. Это также верно для наблюдения с Атомом.
Любые предложения с благодарностью!