1

如何将“值”动态添加到 CheckListEditor?
但是,我必须从 Bclass 选项 attr 中动态获取它,而不是静态“值”。

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',
        )
4

1 回答 1

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调用的特征的属性,即当前对象的命名空间。仅当在另一个类中使用特征名称时才需要上下文。bclassobject

更新以下海报的评论:

在评论中,发帖人询问如果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字典的内容发生变化,视图就会更新。

于 2013-05-21T12:24:22.767 回答