Properties 如何使edit_traits()GUI项响应其依赖项中的更改?

Properties 如何使edit_traits()GUI项响应其依赖项中的更改?,properties,enthought,traitsui,Properties,Enthought,Traitsui,我正在设计一个具有依赖属性的HasTraits子类: #/usr/bin/env python #关于动态更改Dict内容的SO问题示例。 从traits.api导入HasTraits、Dict、Property、Trait、Int、cached_属性 从traitsui.api导入视图,项目 Foo类(HasTraits): 具有相关属性,我希望在GUI中保持最新 _格言=[ {“零”:0,“一”:1}, {“零”:1,“一”:2}, {“零”:2,“一”:3}, ] zap=Int(0) b

我正在设计一个具有依赖属性的
HasTraits
子类:

#/usr/bin/env python
#关于动态更改Dict内容的SO问题示例。
从traits.api导入HasTraits、Dict、Property、Trait、Int、cached_属性
从traitsui.api导入视图,项目
Foo类(HasTraits):
具有相关属性,我希望在GUI中保持最新
_格言=[
{“零”:0,“一”:1},
{“零”:1,“一”:2},
{“零”:2,“一”:3},
]
zap=Int(0)
bar=属性(Trait,取决于=[“zap”])
baz=特质(列表(_dicts[0])[0],_dicts[0])
@缓存的不动产
定义获取条(自身):
返回特征(列表(self.\u dicts)[self.zap],self.\u dicts)
视图(
项目(“zap”),
项目(“酒吧”),
项目(“baz”),
宽度=500,
)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
Foo().configure_traits()
运行此代码时,我看到:

如果我更改
Zap
的值:

注意以下几点:

  • 更改
    Zap
    后,
    Bar
    的地址已更改

    这意味着对
    Bar
    的更改将在GUI中动态更新,而GUI仍处于打开状态;太好了!然而

  • 在GUI中显示
    条的方式不太有用

    我希望将
    Bar
    显示为
    Baz
    :可由用户选择

  • 我想要的是两全其美:

    • 使用
      Bar
      看到的动态GUI更新,以及
    • Baz
      的显示格式
    有人知道我怎么才能得到这个吗

    我尝试了几种方法动态更新类似于
    Baz
    的项目,但都没有效果。
    (请参阅。)

    我假设您希望
    bar
    baz
    都是
    dict
    类型(在traits
    dict
    中)。实际上,对于预定义的特征类型,有一些默认的显示小部件,它们比显示地址更有用。我相信
    traitsui
    不知道如何正确显示自定义Trait对象,除非您明确为其指定编辑器。注意,对于baz,虽然生成了一个下拉菜单,但它只显示键,这也不是很有用

    话虽如此,以下代码可能满足您的期望

    class Foo(HasTraits):
        "Has dependent properties, which I'd like to remain up-to-date in the GUI."
    
        _dicts = [
            {"zero": 0, "one": 1},
            {"zero": 1, "one": 2},
            {"zero": 2, "one": 3},
        ]
    
        zap = Int(0)
        bar = Property(Dict, depends_on=["zap"])
        baz = Trait(list(_dicts[0])[0], _dicts[0])
    
        @cached_property
        def _get_bar(self):
            return self._dicts[self.zap]
    
        traits_view = View(
            Item("zap"),
            Item("bar", style="custom"),
            Item("baz"),
            width=500,
            )
    

    以下代码为我提供了所需的行为:

    #/usr/bin/env python
    #关于动态更改Dict内容的SO问题示例。
    从traits.api导入HasTraits、Dict、Property、Trait、Int、cached_属性、Enum、List
    从traitsui.api导入视图,项目
    Foo类(HasTraits):
    具有相关属性,我希望在GUI中保持最新
    _dict={
    “零”:0,
    "一":一,,
    "二":,
    }
    _zaps=[
    [“零”,“一”],
    [“一”、“二”],
    [“零”,“二”],
    ]
    zaps=List(_zaps[0])
    zap=Enum([0,1,2])#选择“zap”应限制可供选择的“dict”项。
    bar=Enum(_zaps[0][0],value=“zaps”)
    bar=Int(_dict[_zaps[0][0]]
    def_zap_已更改(自身、新值):
    self.zaps=self.\u zaps[新值]
    self.bar=self.\u dict[self.bar]
    定义栏已更改(自身、新值):
    self.bar=self.\u dict[self.bar]
    视图(
    项目(“zap”),
    项目(“酒吧”),
    项目(“条形”,style=“readonly”),
    宽度=500,
    )
    如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
    Foo().configure_traits()
    
    程序启动后立即:

    并在将
    Zap
    更改为“1”后:


    我在这里找到了这个解决方案:,就在“Trait Metadata”部分之前的部分末尾。这个答案有一个基本问题:TraitsUI中没有通用
    Trait
    类型的默认查看器。如@BroCannon所示,通过使用内置Trait,或者通过使用
    default\u traits\u视图
    编写自己的类,您可以得到想要的。