【问题标题】:TabularAdapter customization/notifications?TabularAdapter 自定义/通知?
【发布时间】:2015-03-29 18:58:41
【问题描述】:

感谢 SO (Warren Weckesser) 上的另一位用户,我找到了一种格式化 TabularAdapter 列的好方法。我还想完成一些其他的定制,所以我想我会把它交给 SO 看看我是否能得到更多帮助。

以下代码以我想要使用的格式列出了几个 TabularAdapter 表。我想做两件事:

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

  2. 如果我的任何列中的值之一发生更改,我真正想要的(甚至超过上面的#1)得到通知!我听说有一些“调整”可以用 numpy 数组来完成,但是我太缺乏经验了,还没有完成这个。是否有任何 TraitsAdapter 方法可用于完成这一壮举?

这是我目前的代码(感谢 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()

【问题讨论】:

  • 快 2 年了,我仍然没有找到将列设置为不可编辑的方法:(
  • 关于不可编辑的列,您可能希望发布到新的邮件列表/google 组:“Enthought Tool Suite users”。

标签: enthought traitsui


【解决方案1】:

对于您的第 2 项,在与 Enthought 人员交谈后,我确认尚无官方方法可以做到这一点,但是:

  1. 我为它创建了一张票:https://github.com/enthought/traitsui/issues/387
  2. 我解决了这个问题,方法是保留 ArrayAdapter 的句柄,对其进行子类化,然后重写 set_text 方法,如下所示:

.

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多