我正在使用 Traits-Enaml 库编写应用程序。我的大部分应用程序都是用 Atom 编写的,除了一些需要显示 Chaco 图的类。这些类继承自 HasTraits。例子:
def SomeClass(HasTraits):
some_attr = Any() # Attribute that changes on interaction with plot
plot = Plot() # Chaco plot
这些 SomeClass 实例中的每一个都有一个用户可以与之交互的 Chaco Plot。这些使用 TraitsView 小部件显示在我的 UI 中。如果用户单击绘图中的某个点,则会触发 Someclass 实例的某些特征发生变化。
我的模型(基于 Atom)包含 SomeClass 实例和 SomeClass 实例列表。
def Model(Atom):
ex = Typed(SomeClass) # SomeClass instance
l = ContainerList(Typed(SomeClass)) # List of SomeClass instances
基于此,我有两个问题:
1) 如何从我的 Atom 模型中观察someclass_instance的变化?
当用户与任何绘图交互时,我想在我的模型中触发函数调用。如果 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 是否提供任何工具来侦听 Atom 对象中 HasTraits 对象的变化?
或者,有没有更好的方法来解决这个问题?
2) 我将如何观察列表中任何元素的属性变化?
如果可以按照上述问题中所述进行观察,我将如何观察列表中任何元素的变化?在 Traits 中,我会观察到任何列表项的变化如下:
def AnotherClass(HasTraits):
some_attr = List(Instance(SomeClass)) # List of SomeClass instances which have some trait that changes during runtime.
但是,我不知道如何监听列表中任何特定元素的特征变化。使用 Atom 进行观察也是如此。
任何建议都非常感谢!