我正在设计具有[[dependent属性的HasTraits
子类:
#!/usr/bin/env python
# Example for SO question on dynamically changing Dict contents.
from traits.api import HasTraits, Dict, Property, Trait, Int, cached_property
from traitsui.api import View, Item
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(Trait, depends_on=["zap"])
baz = Trait(list(_dicts[0])[0], _dicts[0])
@cached_property
def _get_bar(self):
return Trait(list(self._dicts)[self.zap], self._dicts)
traits_view = View(
Item("zap"),
Item("bar"),
Item("baz"),
width=500,
)
if __name__ == '__main__':
Foo().configure_traits()
运行此代码时,我看到:并且如果我更改
Zap
的值:注意以下内容:
- 更改
Zap
后,Bar
的地址已更改。这意味着
Bar
的更改将在GUI仍处于打开状态时在其中动态更新;那很棒!但是...- GUI中
Bar
的显示方式不是很有用。我希望将
Bar
显示为Baz
:可由用户选择。我想要两全其美:
Bar
上看到的动态GUI更新,和Baz
的显示格式。我已经尝试了几种方法来动态更新Baz
类项目,但无济于事。(请参见this previous SO question。)
bar
和baz
都为dict
类型(在特征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,
)