2015-03-25 3 views
2

Я обнаружил, что могу применить формат для ВСЕХ столбцов в TabularAdapter, добавив такой оператор в объявление TabularAdapter: format = '% 7.4f'.различные форматы столбцов TabularAdapter?

Однако, я хотел бы иметь различное форматирование для каждого столбца таблицы ... это возможно? Я попытался указать формат только для индекса столбца 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() 

То, что я хотел бы видеть, чтобы иметь третий столбец имеет 4 decmals (это поплавок в конце концов), а в колонках 1 & 2 представлены как целые числа.

ответ

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_array является

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

(см TabularAdapter documentation и this file в 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() 
+0

УДИВИТЕЛЬНЫЙ Уоррен! Ты спас меня так много поисков и проб и ошибок! Я просто надеюсь, что когда-нибудь я получу достаточно знаний в Canopy, чтобы помочь кому-то другому. – Steve76063

+0

Уоррен ... похоже, что у вас есть некоторые глубокие знания табличных адаптеров ... Знаете ли вы, может ли DEF уведомление об изменении отдельного элемента (например, для числа, меняющегося в любой строке/столбце) ? Я искал уведомления о отдельных элементах Array, но не повезло. Видя, что можно сделать с переопределением def get_format(), мне было интересно, есть ли что-то подобное для изменения значения? (мои пальцы скрещены :)) – Steve76063

+0

Для массива numpy, возможно, есть некоторые хаки, которые вы могли бы использовать (например, переопределить метод 'set_text'' TabularAdapter'). Вы должны спросить об этом в новом вопросе, поэтому больше активных пользователей TraitsUI смогут увидеть его (здесь есть несколько SO). –