Skip to main content
 首页 » 编程设计

python之思考特征 UI,动态添加值到 CheckListEditor 的 'values' 特征

2025年05月04日28soundcode

如何向 CheckListEditor 动态添加“值”?
但是我必须从 Bclass options 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', 
        ) 

请您参考如下方法:

不是给 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 View 。

如果 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 字典的内容发生变化, View 就会更新。