2013-05-21 28 views
1

如何將'values'動態添加到CheckListEditor?
但不是靜態'值',我必須從Bclass選項attr動態獲取它。的enthought traits UI,動態添加值到ChecklistEditor的'values'特性

from enthought.traits.api import HasTraits, Instance, Str 
from enthought.traits.ui.api import View, Item, CheckListEditor 

class Bclass: 
    options = ['one', 'two'] 

class Aclass(HasTraits): 
    bclass = Instance(Bclass) 
    abc = Str 
    view = View(
     Item(name='abc', editor=CheckListEditor(values=['one', 'two'])), 
     style='simple', 
     ) 

回答

6

反而給人以CheckListEditorvalues列表,你可以給它包含的價值觀特質的名字:

from traits.api import HasTraits, Instance, Str, List 
from traitsui.api import View, Item, CheckListEditor 

class Bclass(HasTraits): 
    options = List(['one', 'two']) 

class Aclass(HasTraits): 
    bclass = Instance(Bclass) 
    abc = Str 

    traits_view = View(
     Item(name='abc', editor=CheckListEditor(name='object.bclass.options')), 
    ) 

b = Bclass() 
a = Aclass(bclass=b) 
a.configure_traits() 

在這個例子中,'object.bclass.options'表示:性狀叫options這是上下文object中稱爲bclass的特徵的屬性,即當前對象的名稱空間。只有在另一個班級中使用特質名稱時,上下文才是必需的。

更新以下海報的評論:

在評論,海報問Bclass不是HasTraits類,和/或options是一本字典,會發生什麼。

如果Bclass不是HasTraits類,你將無法在詞典內容的變化做出反應,所以我這樣做:

from traits.api import HasTraits, Instance, Str 
from traitsui.api import View, Item, CheckListEditor 

class Bclass(object): 
    options = {'one': 1, 'two': 2} 

class Aclass(HasTraits): 
    bclass = Instance(Bclass) 
    abc = Str 

    def default_traits_view(self): 
     options = self.bclass.options.keys() 
     view = View(
      Item(name='abc', editor=CheckListEditor(values=options)), 
     ) 
     return view 

default_traits_view方法被調用來創建TraitsUI視圖動態。

如果BclassHasTraits類,那麼你可以做的更好:

from traits.api import HasTraits, Instance, Str, Property, Dict 
from traitsui.api import View, Item, CheckListEditor 

class Bclass(HasTraits): 
    options = Dict({'one': 1, 'two': 2}) 

class Aclass(HasTraits): 
    bclass = Instance(Bclass) 
    abc = Str 

    options = Property(Str, depends_on='bclass.options') 
    def _get_options(self): 
     return self.bclass.options.keys() 

    traits_view = View(
     Item(name='abc', editor=CheckListEditor(name='options')), 
    ) 

在這種情況下,視圖更新時的options字典的內容改變。

+0

你會怎麼做,如果,
選項= {「一」:1,「兩節」:2}和
opions.keys()必須與編輯器一起使用
和Bclass可能會或可能不會派生自HasTraits


在您的答覆選項= ['one','two']中,將起作用。

+0

我更新了迴應,以便我可以使用代碼塊。 – pberkes