Может кто-нибудь объяснить, почему этот код дает сбой? Что, по моему мнению, должно произойти, так это то, что он не должен падать, если он использует полные имена свойств, как в данном случае.
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
.
InteractiveSubwindow
, но нигде в коде, который вы цитируете, этого нет. Пожалуйста, исправьте свой пример так, чтобы он работал и выдавал ошибку, о которой вы спрашиваете. Спасибо! - person Robert Kern   schedule 05.11.2013