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. Также в представлении столбец заполнен "Формат!" ключевое слово Это все логично, так как представление запрашивает объект, который больше не существует.

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

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

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

1 ответ

Решение

Вы можете предоставить список 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 имя признака отредактированного объекта, который содержит (обычно динамическое) значение.

Другие вопросы по тегам