Проверить стек признаков для TreeView?

Мы пытаемся оценить осуществимость этой идеи:

У нас есть довольно большой стек объектов HasTraits в программе моделирования. Например, если мы моделируем два материала, мы можем получить доступ к их различным атрибутам с помощью:

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

Мы использовали этот код для симуляций, где мы просто увеличивали значения признака. Например, мы могли бы запустить симуляцию, где index_of_refraction одного из этих материалов изменяется от 1,3 до 1,6 в течение 10 итераций. Это на самом деле работает довольно хорошо.

Проблема заключается в выборе желаемых признаков для моделирования. Пользователи не будут знать все эти имена переменных трейтов, поэтому мы хотели представить иерархическое/древовидное представление всей структуры трейтов программы. Для двух вышеуказанных признаков это может выглядеть так:

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

И т.д...

Я знаю, что traitsui поддерживает TreeEditors, но есть ли примеры создания TreeEditor на основе проверки стека HasTraits, подобного этому? Каков самый простой способ получить стек признаков из объекта? По сути, эта идея осуществима или мне следует вернуться к чертежной доске?

Спасибо


person Adam Hughes    schedule 14.01.2015    source источник


Ответы (2)


Это делает ValueEditor. Вы можете посмотреть, как он настраивает TreeEditor для этого здесь:

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

person Robert Kern    schedule 14.01.2015
comment
Спасибо. Я никогда не понимал, что это работает таким образом, несмотря на то, что это довольно хорошо задокументировано: code.enthought.com/projects/traits/docs/html/TUIUG/ Цените это. - person Adam Hughes; 15.01.2015
comment
Роберт, навскидку, у вас есть предложение, как анализировать окончательные характеристики, которые отображаются для пользователей? Я хочу скрыть некоторые трейты, которые, как я знаю априори, не должны быть в представлении, а также некоторые из более личных. На снимке экрана в моем ответе ниже это будет включать черту modeltree и listener_traits. Кроме того, мой редактор не имеет причудливых цветов и макета, как в ссылке, которую вы предоставили. Как вы думаете, это потому, что я использую бэкенд QT вместо WX, или скриншот в сети уже не актуален? - person Adam Hughes; 15.01.2015
comment
Вы можете посмотреть на реализацию ValueEditor, чтобы увидеть, как она строит базовый TreeEditor. Все кишки находятся в TraitsNode в этом value_tree.py модуле. Вы можете создать подкласс TraitsNode, чтобы заменить tno_get_children(), чтобы настроить, какие признаки считаются дочерними. - person Robert Kern; 15.01.2015
comment
Мы очень старались заставить это работать, но, в конце концов, для меня не очевидно, как изменить tno_get_children() в редакторе. Это связано с тем, что ValueEditor возвращается фабрикой, и поэтому мы не могли понять, как изменить поведение этого узла и сделать так, чтобы _ValueEditor, SimpleEditor, ValueEditor, Editor и все взаимосвязанные объекты знали об этом. Я закончил тем, что обезьяна исправляла TraitsNode во время выполнения. - person Adam Hughes; 28.01.2015
comment
Не используйте ValueEditor; просто посмотрите на его реализацию, чтобы увидеть, как настроить TreeEditor, который делает большую часть того, что вам нужно делать. Вместо того, чтобы настраивать его с помощью TraitsNode, вместо этого передайте свой настроенный подкласс TraitsNode. - person Robert Kern; 28.01.2015
comment
Спасибо. Я пробовал это, можете ли вы взглянуть на мой измененный ответ ниже для проблемы, с которой я столкнулся. - person Adam Hughes; 28.01.2015
comment
Вам необходимо настроить TreeEditor. Вы не можете просто положить его туда ненастроенным. В частности, вам необходимо предоставить список nodes=. Посмотрите, как ValueEditor создает TreeEditor: github. com/enthought/traitsui/blob/master/traitsui/editors/ - person Robert Kern; 29.01.2015
comment
Я создаю TreeEditor идентичным образом: `Item(name='stack', editor=TreeEditor(auto_open=2, hide_root=False, editable=True, nodes=value_tree_nodes)), `Но получаю ошибку: TraitError: The 'adapter' trait of an ITreeNodeAdapterBridge instance must be an implementor of, or can be adapted to implement, ITreeNode or None, - person Adam Hughes; 29.01.2015
comment
Все в порядке, мы просто реализуем обходной путь, я не хочу тратить на это ваше время. Спасибо, что пытаетесь нам помочь, мы, наверное, просто дремучие. - person Adam Hughes; 29.01.2015

введите здесь описание изображения

Вот изображение из решения Роберта.

Последующее обсуждение

Роберт, представьте, что у меня есть собственный 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.

Я пробовал это с _ValueTree, ValueTree, value_tree_editor, value_tree_editor_with_root, _ValueEditor и ValueEditor.

Единственный, который работает, — это ValueEditor, поэтому, хотя я могу понять, как создавать подклассы TraitsNode, не похоже, что это сработает, если я не подключу все через EditorFactory. IE поведение, которое мы хотим настроить, полностью находится в TreeEditor, и оно скрыто под _ValueEditor, ValueEditor, EditorFactory и т. д.

Есть ли в этом смысл?

person Adam Hughes    schedule 14.01.2015