2013-05-21 1 views
1

Как добавить динамические значения в CheckListEditor?
Но вместо статических «значений», я должен динамически его получать из параметров Bclass attr.enthought traits UI, динамически добавлять значения в значение «values» CheckListEditor

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

Вместо того, чтобы давать в CheckListEditor список values, вы можете дать ему имя признака, содержащее значение:

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 которые является атрибутом признака bclass в контексте object, т. е. пространства имен текущего объекта. Контекст необходим только при использовании имени признака в другом классе.

Update следующего комментарий плаката:

В комментариях, плакат спросил, что случилось бы, если 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 динамически.

Если Bclass является HasTraits класс, то вы можете сделать лучше:

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