检查TreeView的特征堆栈?

时间:2015-01-14 17:56:09

标签: python enthought traits traitsui

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

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

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

我们已将此代码用于模拟,其中我们仅增加特征的值。例如,我们可以运行模拟,其中一种材料的index_of_refraction在10次迭代中从1.3到1.6变化。它实际上工作得很好。

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

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

等等...

我知道traitsui支持TreeEditors,但有没有基于像这样检查HasTraits堆栈构建TreeEditor的例子?从对象中获取特征堆栈的最简单方法是什么?从本质上讲,这个想法是否可行,还是应该回到绘图板上?

由于

2 个答案:

答案 0 :(得分:2)

ValueEditor执行此操作。您可以在此处查看它如何配置TreeEditor来执行此操作:

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

答案 1 :(得分:1)

enter image description here

以下是罗伯特解决方案的图片。

后续讨论

罗伯特,想象我有一个自定义的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等......

这有意义吗?