我们正试图评估这个想法的可行性:
我们在建模程序中有很多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的例子?从对象中获取特征堆栈的最简单方法是什么?从本质上讲,这个想法是否可行,还是应该回到绘图板上?
由于
答案 0 :(得分:2)
ValueEditor
执行此操作。您可以在此处查看它如何配置TreeEditor
来执行此操作:
https://github.com/enthought/traitsui/blob/master/traitsui/value_tree.py
答案 1 :(得分:1)
以下是罗伯特解决方案的图片。
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.
我已经通过_ValueTree
,ValueTree
,value_tree_editor
,value_tree_editor_with_root
,_ValueEditor
和ValueEditor
尝试了此操作。
唯一有效的是ValueEditor,因此,即使我能理解如何将TraitsNode子类化,但除非我通过EditorFactory挂钩所有内容,否则它似乎不会起作用。 IE我们想要自定义的行为一直在TreeEditor中,并且被隐藏在_ValueEditor,ValueEditor,EditorFactory等......
这有意义吗?