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仍处于打开状态;太好了!然而条的方式不太有用
我希望将Bar
显示为Baz
:可由用户选择
- 使用
看到的动态GUI更新,以及Bar
的显示格式Baz
Baz
的项目,但都没有效果。
(请参阅。)我假设您希望
bar
和baz
都是dict
类型(在traitsdict
中)。实际上,对于预定义的特征类型,有一些默认的显示小部件,它们比显示地址更有用。我相信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视图
编写自己的类,您可以得到想要的。