检查 TreeView 的特征堆栈?

Inspect stack of traits for TreeView?

我们正在尝试评估这个想法的可行性:

我们在建模程序中有相当深的 HasTraits 对象堆栈。例如,如果我们正在对两种材料进行建模,我们可以通过以下方式访问这些材料的各种属性:

Layer.Material1.Shell.index_of_refraction
Layer.Material5.Medium.index_of_refraction

我们已经将这段代码用于模拟,我们只是增加了一个特征的值。例如,我们可以 运行 模拟这些材料之一的 index_of_refraction 在 10 次迭代中从 1.3 变化到 1.6。它实际上工作得很好。

问题在于为模拟选择所需的特征。用户不会知道所有这些特征变量名称,因此我们想呈现程序的整个特征结构的 heirarchal/tree 视图。对于以上两个特征,它可能看起来像:

Layer
 - Material1
    - Shell
        - index_of_refraction
 - Material2
    - Medium
        - index_of_refraction

等等...

我知道 traitsui 支持 TreeEditor,但是有没有像这样基于检查 HasTraits 堆栈来构建 TreeEditor 的示例?从对象中获取特征堆栈的最直接方法是什么?本质上,这个想法可行还是我应该重新开始?

谢谢

ValueEditor就是这样做的。您可以在此处查看它如何配置 TreeEditor 来执行此操作:

https://github.com/enthought/traitsui/blob/master/traitsui/value_tree.py

这是来自 Robert 解决方案的图像。

后续讨论

罗伯特,假设我有一个自定义的 TreeEditor。好像不让我直接用:

Item('myitem', editor=TreeEditor())

我得到:

traits.trait_errors.TraitError: The 'adapter' trait of an ITreeNodeAdapterBridge instance must be an implementor of, or can be adapted to implement, ITreeNode or None, but a value of [<pame.gensim.LayerSimulation object at 0x7fb623bf0830>] <class 'traits.trait_handlers.TraitListObject'> was specified.

我已经用 _ValueTreeValueTreevalue_tree_editorvalue_tree_editor_with_root_ValueEditorValueEditor 试过了。

唯一可用的是 ValueEditor,因此,即使我能理解如何将 TraitsNode 子类化,它似乎也不会起作用,除非我通过 EditorFactory 将所有内容连接起来。 IE 我们想要自定义的行为一直在 TreeEditor 中,并且隐藏在 _ValueEditor、ValueEditor、EditorFactory 等下...

这有意义吗?