Python ENTHOUND ENML表格编辑器

Python ENTHOUND ENML表格编辑器,python,traits,enthought,traitsui,enaml,Python,Traits,Enthought,Traitsui,Enaml,我有一个带有自定义表编辑器的对象附加到视图。用户输入可以删除此表编辑器的某些列。当我调用update函数时,这个函数也会在对象实例化时被调用 class ModelList(HasTraits): models = List(Instance(Model)) table_editor = TableEditor() view = View(Item(name='variables', show_label=False, editor=table_editor))

我有一个带有自定义表编辑器的对象附加到视图。用户输入可以删除此表编辑器的某些列。当我调用update函数时,这个函数也会在对象实例化时被调用

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
在ENML布局中,此对象的引用方式如下:

enamldef Main(Window):
    attr model_list
    Container:
        TraitsItem: table:
            model := model_list
它在实例化时工作得很好,但是当一列被删除时,它会保留在视图中,并且终端会被AttributeErrors填充。在视图中,该列也填充了“Format!”关键字。这是合乎逻辑的,因为视图正在查询一个不再存在的对象

因此,我的问题是,如何在更改ModelList对象后使视图完全重新加载自身

我还尝试重新定义edit_traits(),因为这是在构造视图时由ENML调用的方法,但该函数在实例化时只调用一次


非常感谢。

您可以在
模型列表
类中提供
对象列的列表
。使用
columns\u name
参数,而不是在
TableEditor
工厂对象上定义
columns
列表,以指向
modelist
上特征的名称。每当您在
模型列表
上更新列表时,
表格编辑器
的实现应该随之进行

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

这是Traits UI中的常见模式。在许多地方,您可以选择给
编辑器一个显式的值(通常是静态的),或者给
编辑器一个保存(通常是动态的)值的编辑对象上的特征的名称。

为了清楚起见,这里并不真正涉及ENML。您正好通过ENML的
TraitsItem
组件公开了
traitsui
视图,但是
TableEditor
traitsui
框架的一部分,其行为与ENML无关。您只需使用
。编辑\u traits()/。配置\u traits()
方法即可查看GUI,只需使用
traitsui
。我建议从这个问题中删除
enaml
标记。我认为这会让问题变得特别有趣,Robert,这表明traitui和enaml可以很好地结合使用。这很有意义,谢谢你的努力。在过程中更好地理解traits api;)