2015-05-05 3 views
2

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

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

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 разрешит эту проблему, обратившись к методу bound и позвольте мне фактически вызвать метод bound в этом экземпляре, но похоже, что семантика Method ничем не отличается от Callable. И я не могу найти способ поставить аргументы на фабрику динамически, другие, возможно, из-за хакерского использования eval или глобальных переменных (factory_row_args отклоняет динамические аргументы).

ответ

0

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

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())