traitsui对象模型如何工作

时间:2013-11-04 22:52:43

标签: python traits enthought traitsui

有人能解释为什么这段代码会崩溃吗?我认为应该发生的是,如果它使用完全限定的特征名称,它就不会崩溃,在这种情况下就是这样。

from traits.api import *
from traitsui.api import *

class Struct(HasTraits): pass

class Struct1(Struct):
  some_data=Int(4)
  some_more_data=Str('pizza')

class Struct2(Struct):
  some_data=Int(5)
  some_more_data=Str('wossar')

class Subwindow(Handler):
  struct1=Instance(Struct1)
  struct2=Instance(Struct2)

  which_struct=Enum(1,2)
  cur_struct=Any

  def _struct1_default(self): return Struct1()
  def _struct2_default(self): return Struct2()
  def _cur_struct(self): return self.struct1

  @on_trait_change('which_struct')
  def switch_views(self): NotImplemented #switch views here

traits_view=View(
    Item(name='which_struct'),
    Item(name='object.cur_struct.some_data'),
    Item(name='object.cur_struct.some_more_data'),
)

Subwindow().configure_traits()

当我运行时,我得到了

AttributeError: 'Subwindow' object has no attribute 'object.cur_struct.some_data'

但是如果你检查对象的确如此。

我正在摆弄这个例子,如果我用cur_struct特征替换Property,我就能正常工作,我不知道为什么。但是,对于我的实际应用程序来说,这是不可行的,其中另一个类从一个完全不同的类中侦听事件并切换cur_struct

1 个答案:

答案 0 :(得分:2)

啊,不要使用Item(name=...)。只需将名称作为第一个位置参数传递即可。在将赋值传递给name特征之前,构造函数对传递给它的值执行一些特殊处理。显式使用name仅在我们需要避免处理时在内部使用。