2013-11-04 32 views
0

有人可以解釋爲什麼此代碼崩潰?我認爲應該發生的是,如果它使用完全限定的特徵名稱,它不應該崩潰,在這種情況下它是完全合格的特徵名稱。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' 

但確實,如果你檢查的對象。

我正在擺弄這個例子,如果我用Property替換cur_struct特性,我就會正確地工作,我不知道爲什麼。然而,對於我的真實應用來說,這是不可行的,其中另一個類監聽來自完全不同的類的事件並且開關cur_struct

+0

你的回溯表示'InteractiveSubwindow',但是在你引用的代碼中沒有出現。請更正您的示例,使其運行並提供您所詢問的錯誤。謝謝! –

+0

對不起,它只是子窗口。更簡單的例子給出了同樣的錯誤。 – aestrivex

回答

2

啊,不要用Item(name=...)。只需將名稱作爲第一個位置參數傳遞即可。構造函數在將其分配給name特性之前,對傳遞給它的值進行一些特殊處理。明確使用name僅在需要避免該處理時在內部使用。