Traits-Enaml ライブラリを使用してアプリケーションを作成しています。Chaco プロットを表示する必要があるいくつかのクラスを除いて、私のアプリケーションのほとんどは Atom で書かれています。これらのクラスは 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
これに基づいて、私は2つの質問があります:
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 では、observed 属性が 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 で観測する場合にも当てはまります。
どんな提案でも大歓迎です!