Traits-Enaml:观察Atom模型中的特征变化

时间:2015-03-04 12:03:49

标签: python traits chaco enaml

我正在使用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观察也是如此。

非常感谢任何建议!

0 个答案:

没有答案