我正在使用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要求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.
但是,我无法弄清楚如何监听列表中任何特定元素的 traits 的更改。对于使用Atom观察也是如此。
非常感谢任何建议!