在traitsui工厂中使用方法特征

时间:2015-05-05 00:35:49

标签: enthought traits traitsui

我试图找出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()

所以我在这里要做的是设置工厂,以便用户可以向表中添加新项目,其中包含用户当前在GUI中指定的任何值作为初始value。 / p>

有没有办法做到这一点?我认为使用Method特征会通过引用绑定方法来解决这个问题,并允许我在这个实例中实际调用绑定方法,但似乎Method的语义与Callable。而且我无法找出以任何方式动态地为工厂提供参数,其他可能是通过hacky使用eval或全局变量(factory_row_args拒绝动态参数)。

1 个答案:

答案 0 :(得分: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())