您可以给它一个包含值的特征的名称,而不是给它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
更新以下海报的评论:
在评论中,发帖人询问如果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
字典的内容发生变化,视图就会更新。