在 traitsui 工厂中使用方法特征
using a method trait in a traitsui factory
我想弄清楚 Method
traits 是如何工作的,以及我是否可以在 traits View 对象中定义的工厂中使用一个,以便将动态值传递给工厂。
这就是我的意思,一个最小的测试用例,除了工厂行为(它运行,但使用工厂会导致崩溃):
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()
所以我在这里尝试做的是设置工厂,以便用户可以向 table 添加新项目,其中包含初始值 value
当前指定的任何值GUI 中的用户。
有什么办法吗?我认为使用 Method
特性可以通过引用绑定方法来解决这个问题,并允许我在此实例中实际调用绑定方法,但似乎 Method
的语义与Callable
。而且我想不出任何方法来动态地向工厂提供参数,除了可能使用 eval
或全局变量(factory_row_args
拒绝动态参数)之外。
昨天很累,今天想到了一个显而易见的办法:
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())
我想弄清楚 Method
traits 是如何工作的,以及我是否可以在 traits View 对象中定义的工厂中使用一个,以便将动态值传递给工厂。
这就是我的意思,一个最小的测试用例,除了工厂行为(它运行,但使用工厂会导致崩溃):
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()
所以我在这里尝试做的是设置工厂,以便用户可以向 table 添加新项目,其中包含初始值 value
当前指定的任何值GUI 中的用户。
有什么办法吗?我认为使用 Method
特性可以通过引用绑定方法来解决这个问题,并允许我在此实例中实际调用绑定方法,但似乎 Method
的语义与Callable
。而且我想不出任何方法来动态地向工厂提供参数,除了可能使用 eval
或全局变量(factory_row_args
拒绝动态参数)之外。
昨天很累,今天想到了一个显而易见的办法:
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())