использование трейта метода в фабрике трейтсуи

Я пытаюсь выяснить, как работают черты Method, и могу ли я использовать их в фабрике, определенной в объекте представления характеристик, чтобы динамические значения передавались в фабрику.

Вот что я имею в виду, минимальный тестовый пример, который работает, за исключением фабричного поведения (он работает, но использование фабрики вызовет сбой):

from traits.api import HasTraits, Method, Str, List, Instance, method, Int, Any
from traitsui.api import View, Item, TableEditor, ObjectColumn, TextEditor

class Dog(HasTraits):
    name = Str('Fido')
    value = Int(5)

class DogTable(HasTraits):

    def factory(self):
        return Dog(value=self.current_user_value)    

    dog_factory = Method(factory)

    dogs = List(Instance(Dog))
    current_user_value = Int(3)

    def _dogs_default(self):
        return [
            Dog(name='Joe', value=6),
            Dog(name='Ted', value=2),
        ]

    traits_view = View(
        Item('dogs',
            editor=TableEditor( columns =
                [
                ObjectColumn(label='name', editor=TextEditor(), name='name'),
                ObjectColumn(label='value', editor=TextEditor(), name='value'),
                ],
               row_factory = dog_factory,
            )
        ),
        Item('current_user_value'),
        height=300, width=300,
    )

DogTable().configure_traits()

Итак, что я пытаюсь сделать здесь, так это настроить фабрику, чтобы пользователь мог добавлять новые элементы в таблицу, которая содержит в качестве начального value любое значение, указанное пользователем в данный момент в графическом интерфейсе.

Есть ли способ сделать это? Я думал, что использование трейта Method решит эту проблему, ссылаясь на связанный метод и позволив мне фактически вызвать связанный метод в этом экземпляре, но похоже, что семантика Method ничем не отличается от Callable. И я не могу придумать никакого способа динамически передавать аргументы фабрике, кроме, возможно, хакерского использования eval или глобальных переменных (factory_row_args отклоняет динамические аргументы).


person aestrivex    schedule 05.05.2015    source источник


Ответы (1)


Вчера я очень устал, сегодня я придумал очевидный способ сделать это:

def dog_factory(self):
    return Dog(value=self.current_user_value)

def view_getter(self):
    return  View(
        Item('dogs',
            editor=TableEditor( columns =
                [
                ObjectColumn(label='name', editor=TextEditor(), name='name'),
                ObjectColumn(label='value', editor=TextEditor(), name='value'),
                ],  
               row_factory = self.dog_factory
            )
        ),
        Item('current_user_value'),
        height=300, width=300,
    )

def configure_traits(self):
    super(DogTable, self).configure_traits(view=self.view_getter())
person aestrivex    schedule 05.05.2015