感谢SO(Warren Weckesser)的另一位用户,我发现了一种格式化TabularAdapter列的好方法。还有其他一些我想要完成的定制,所以我想我会把它拿出去看看能不能得到更多的帮助。
以下代码以我想要使用的格式显示了几个TabularAdapter表。我希望能做的是两件事:
我想将第一列设置为不可编辑。我已经找到了如何将行设置为不可编辑但不是列 - 这可能吗?
我真正喜欢的(甚至超过上面的#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()
答案 0 :(得分:0)
对于您的第2项,在与Enthought人员交谈后,我确认目前还没有正式方法可以做到这一点,但是:
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