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.

Однако я не мог понять, как прислушиваться к изменениям в характеристиках какого-либо конкретного элемента в списке. Это также верно для наблюдения с Атомом.

Любые предложения с благодарностью!

0 ответов

Другие вопросы по тегам