2

我发现我可以通过在 TabularAdapter 声明中添加这样的语句来将格式应用于 TabularAdapter 中的所有列:format = '%7.4f'。

但是,我想为表格中的每一列设置不同的格式……这可能吗?我试图为列索引 2 指定格式(如下例所示),但它并不只适用于该列。我一直在寻找如何正确执行此操作,但到目前为止一无所获。

这是一个小示例文件:

from traits.api import HasTraits, Array

from traitsui.api import View, Group,Item, TabularEditor
from traitsui.tabular_adapter import TabularAdapter
from numpy import dtype

test_dtype = dtype([('Integer#1', 'int'), ('Integer#2', 'int'), ('Float', 'float')])

class testArrayAdapter(TabularAdapter):
    columns = [('Col1 #', 0), ('Col2', 1), ('Col3', 2)]
    even_bg_color = 0xf4f4f4 # very light gray
    width = 125

class test(HasTraits):
    test_array = Array(dtype=test_dtype)

    view = View(
        Item(name = 'test_array',
            show_label = False,
            editor     = TabularEditor(adapter = testArrayAdapter()),
        ),
        Item(name = 'test_array',
            show_label = False,
            editor     = TabularEditor(adapter = testArrayAdapter(column=2, format='%.4f')),
        ),
    )


Test = test()
Test.test_array.resize(5, refcheck = False)
Test.configure_traits()

我想看到的是让第 3 列有 4 个小数(毕竟它是一个浮点数),而第 1 列和第 2 列仅显示为整数。

4

1 回答 1

2

至少有两种方法可以做到这一点。一种是覆盖适配器类中的方法get_format(self, object, name, row, column)TabularAdapter并让它根据column参数返回适当的格式。例如

    def get_format(self, object, name, row, column):
        formats = ['%d', '%d', '%.4f']
        return formats[column]

另一种方法是使用TabularAdapter类中实现的“特征魔法”。Str在您的子类中,您可以通过定义一个特别命名的特征来设置列的格式。适用于 numpy 结构化数组的一组名称,例如您的test_arrayis

    object_0_format = Str("%d")
    object_1_format = Str("%d")
    object_2_format = Str("%.4f")

(有关更多信息,请参阅TabularAdapter文档,以及github 存储库中的此文件。)

这是演示这两种方法的脚本的修改版本。为了多样化,我使用"%04d"了第一列的格式。(我希望你不介意无端的名称和风格变化。)

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 = ['%04d', '%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("%04d")
    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()
于 2015-03-28T01:47:44.537 回答