0

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

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

4

1 回答 1

2

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

于 2013-11-05T15:28:18.620 回答