Я пытаюсь выяснить, как работают черты 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
отклоняет динамические аргументы).