【问题标题】:Enthought enaml tableeditorEnthought 搪瓷表编辑器
【发布时间】:2013-04-23 09:53:12
【问题描述】:

我有一个对象,该对象带有附加到视图的自定义表格编辑器。此表编辑器可以通过用户输入删除其某些列。在这种情况下我调用了一个更新函数,这个函数在对象的实例化时也会被调用。

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 在构造视图时调用的方法,但该函数仅在实例化时调用一次。

非常感谢。

【问题讨论】:

  • 为了清楚起见,Enaml 并没有真正涉及到这里。您恰好通过 Enaml 的 TraitsItem 组件暴露了 traitsui View,但 TableEditortraitsui 框架的一部分,它的行为独立于 Enaml。您将看到这种行为仅使用.edit_traits()/.configure_traits() 方法来查看仅使用traitsui 的GUI。我建议从这个问题中删除enaml 标签。
  • 我认为这让 Robert 更加有趣,证明 traitui 和 enaml 可以很好地结合使用。这是非常相关的信息

标签: python traits enthought traitsui enaml


【解决方案1】:

您可以提供ObjectColumns 列表作为ModelList 类的特征。不要在TableEditor 工厂对象上定义columns 列表,而是使用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

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

【讨论】:

  • 非常感谢。在此过程中更好地了解特征 api ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多