gpt4 book ai didi

enthought - TabularAdapter 自定义/通知?

转载 作者:行者123 更新时间:2023-12-02 22:35:11 25 4
gpt4 key购买 nike

感谢 SO 上的另一位用户 (Warren Weckesser),我找到了一种格式化 TabularAdapter 列的好方法。我还想完成一些其他自定义,所以我想我应该将其发布给 SO,看看是否可以获得更多帮助。

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

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

  2. 我真正希望的是(甚至比上面的#1更重要)它能够在我的任何列中的值之一发生变化时收到通知!我听说可以使用 numpy 数组进行一些“调整”来完成此任务,但我还没有经验,无法实现这一点。是否有任何 TraitsAdapter mentods 可用于完成此壮举?

这是迄今为止我的代码(感谢 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 项,在与 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

关于enthought - TabularAdapter 自定义/通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29333459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com