2013-04-23 1 views
0

У меня есть объект с настраиваемым редактором таблицы, прикрепленным к представлению. Этот редактор таблиц может удалить часть своего столбца с помощью ввода пользователем. Когда это так, я вызываю функцию обновления, эта функция также вызывается при создании объекта.Enthought enaml tableeditor

class ModelList(HasTraits): 

    models = List(Instance(Model)) 
    table_editor = TableEditor() 
    view = View(Item(name='variables', show_label=False, editor=table_editor)) 

    def update(self) : 
     columns = [] 
     for model in self.models : 
      columns.append(ObjectColumn(..some stuff..)) 
     self.table_editor.columns = columns 
     self.traits_modified = True 

В макете enaml этот объект называется как то:

enamldef Main(Window): 
    attr model_list 
    Container: 
     TraitsItem: table: 
      model := model_list 

Он хорошо работает в конкретизации, однако, когда столбец удаляется он остается в представлении, и терминал заполнен AttributeErrors. Также в представлении столбец заполняется «Format!». ключевое слово. Это все логично, поскольку представление запрашивает объект, который больше не существует.

Итак, мой вопрос в том, как я могу сделать представление полностью перезагруженным после изменения моего объекта ModelList?

Я также попытался переопределить edit_traits(), так как это метод, называемый enaml при построении представления, но функция вызывается только один раз при создании экземпляра.

Большое спасибо заранее.

+2

Просто для ясности, Enaml здесь действительно не участвует. Вы просто обнаруживаете «traitsui» «Просмотр» через компонент «TraitsItem» Enaml, но «TableEditor» является частью структуры «traitsui», и его поведение не зависит от Enaml. Вы увидите это поведение, используя методы '.edit_traits() /. Configure_traits()' для просмотра графического интерфейса с помощью только 'traitsui'. Я рекомендую удалить тег 'enaml' из этого вопроса. –

+0

Я думаю, что это делает его интересным Робертом, демонстрируя, что traitui и enaml могут хорошо работать вместе. Это очень актуальная информация. – Jelle

ответ

2

Вы можете предоставить список ObjectColumns в качестве признака на вашем классе ModelList. Вместо определения списка columns на фабричном объекте TableEditor используйте аргумент columns_name вместо этого, чтобы указать на имя признака на ModelList. Всякий раз, когда вы обновляете список на ModelList, реализация TableEditor должна следовать.

class ModelList(HasTraits): 
    models = List(Instance(Model)) 
    columns = List(Instance(ObjectColumn)) 
    variables = ... 

    traits_view = View(UItem('variables', 
     editor=TableEditor(columns_name='columns'))) 

    def update(self): 
     columns = [] 
     for model in self.models : 
      columns.append(ObjectColumn(..some stuff..)) 
     self.columns = columns 

Это общий шаблон в пользовательском интерфейсе моделей. Во многих местах у вас есть выбор между предоставлением Editor явного значения (которое обычно является статическим) или присвоение Editor имени признака на отредактированном объекте, который содержит (обычно динамическое) значение.

+0

Спасибо, много что сработало. Понимание немного лучших черт api в этом процессе;) – user2310664