我有一个附加到视图的自定义表编辑器的对象。此表编辑器可以通过用户输入删除其某些列。在我调用更新函数的情况下,也会在对象的实例化时调用此函数。
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在构造视图时调用的方法,但该函数在实例化时只调用一次。
非常感谢提前。
答案 0 :(得分: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
这是Traits UI中的常见模式。在许多地方,您可以选择为Editor
提供一个显式值(通常是静态的),或者在保留(通常为动态)的已编辑对象上为Editor
提供特征的名称)价值。