1

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

任何建议都非常感谢!

4

0 回答 0