TabularAdapter自定义/通知?

时间:2015-03-29 18:58:42

标签: enthought traitsui

感谢SO(Warren Weckesser)的另一位用户,我发现了一种格式化TabularAdapter列的好方法。还有其他一些我想要完成的定制,所以我想我会把它拿出去看看能不能得到更多的帮助。

以下代码以我想要使用的格式显示了几个TabularAdapter表。我希望能做的是两件事:

  1. 我想将第一列设置为不可编辑。我已经找到了如何将行设置为不可编辑但不是列 - 这可能吗?

  2. 我真正喜欢的(甚至超过上面的#1)如果我的任何一列中的某个值发生变化,我会收到通知!我听说有一些'调整'可以通过numpy数组来完成这个,但是我太缺乏经验但还没有完成这个。是否有可用于完成此专长的TraitsAdapter方法?

  3. 到目前为止,这是我的代码(感谢Warren的修改):

    from traits.api import HasTraits, Array, Str
    from traitsui.api import View, Item, TabularEditor
    from traitsui.tabular_adapter import TabularAdapter
    from numpy import dtype
    
    
    test_dtype = dtype([('Integer#1', 'int'),
                        ('Integer#2', 'int'),
                        ('Float', 'float')])
    
    
    class TestArrayAdapter1(TabularAdapter):
    
        columns = [('Col1 #', 0), ('Col2', 1), ('Col3', 2)]
    
        even_bg_color = 0xf4f4f4  # very light gray
    
        width = 125
    
        def get_format(self, object, name, row, column):
            formats = ['%d', '%d', '%.4f']
            return formats[column]
    
    
    
    class TestArrayAdapter2(TabularAdapter):
    
        columns = [('Col1 #', 0), ('Col2', 1), ('Col3', 2)]
    
        even_bg_color = 0xf4f4f4  # very light gray
    
        width = 125
    
        object_0_format = Str("%d")
        object_1_format = Str("%d")
        object_2_format = Str("%.4f")
    
    
    
    class Test(HasTraits):
    
        test_array = Array(dtype=test_dtype)
    
        view = \
            View(
                Item(name='test_array', show_label=False,
                    editor=TabularEditor(adapter=TestArrayAdapter1())),
                Item(name='test_array', show_label=False,
                    editor=TabularEditor(adapter=TestArrayAdapter2())),
            )
    
    
    test = Test()
    test.test_array.resize(5, refcheck=False)
    test.configure_traits()
    

1 个答案:

答案 0 :(得分:0)

对于您的第2项,在与Enthought人员交谈后,我确认目前还没有正式方法可以做到这一点,但是:

  1. 我为它创建了一张票:https://github.com/enthought/traitsui/issues/387
  2. 我解决了这个问题,通过保留ArrayAdapter的句柄,将其子类化,并覆盖set_text方法,如下所示:
  3. class NotifyingArrayAdapter(ArrayAdapter):
    
        value_changed = Event
    
        def set_text(self, object, trait, row, column, text):
            super(NotifyingArrayAdapter, self).set_text(object, trait, row,
                                                              column, text)
            self.value_changed = True
    

    这样,我就可以听取value_changed事件,并用它做我需要的事情。

    你可以变得更加漂亮,并使事件成为一个更复杂的对象,例如存储有关旧/新值的信息,以及行和列的更改:

    class ArrayAdapterEvent(HasStrictTraits):
        row = Int
        column = Int
        old = Str
        new = Str
    
    
    class NotifyingArrayAdapter(ArrayAdapter):
    
        value_changed = Event(Instance(ArrayAdapterEvent))
    
        def set_text(self, object, trait, row, column, text):
            old = self.get_text(object, trait, row, column)
            super(NotifyingArrayAdapter, self).set_text(object, trait, row,
                                                          column, text)
            event = ArrayAdapterEvent(old=old, new=text, row=row, column=column)
            self.value_changed = event