我如何使edit_traits()GUI项目响应其依赖项的变化?

问题描述 投票:0回答:1

我正在设计具有[[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()
运行此代码时,我看到:

Initial GUI

并且如果我更改Zap的值:

After changing Zap

注意以下内容:

  1. 更改Zap后,Bar的地址已更改。

    这意味着Bar的更改将在GUI仍处于打开状态时在其中动态更新;那很棒!但是...

  2. GUI中Bar的显示方式不是很有用。

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

我想要两全其美:

    我在Bar上看到的动态GUI更新,和
  • Baz的显示格式。
  • 有人知道我怎么能得到这个吗?

    我已经尝试了几种方法来动态更新Baz类项目,但无济于事。(请参见this previous SO question。)

  • properties enthought traitsui
    1个回答
    0
    投票
    我假设您希望barbaz都为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, )

    © www.soinside.com 2019 - 2024. All rights reserved.