嵌套的HasTraits对象,如何正确初始化

时间:2014-11-10 14:52:52

标签: python enthought traitsui

我正在尝试创建一个HasTraits对象,其中包含另一个HasTraits对象的其他几个不同的实例。但是,当我在主对象中初始化我的许多HasTraits对象时,我总是遇到问题。

我在下面制作了一个产生错误的简单示例。有人可以解释这样做的最佳方法吗? - 我永远不知道什么时候应该使用traits.Instance(traits.Int)或只是traits.Int - 如何在构造函数中传递特征的初始值?每当我这样做时,我会收到错误,如"类型为int required但找到类型traits.Int"

感谢您的帮助

import enthought.traits.api as traits
import enthought.traits.ui.api as traitsui 

class Simple(traits.HasTraits):

    minimum = traits.Int()
    maximum= traits.Int()
    ranged = traits.Range(minimum, maximum)

    traits_view = traitsui.View(traitsui.Group(
    traitsui.Item('minimum'),
    traitsui.Item('maximum'),
    traitsui.Item('ranged')    
    ))

class Complex(traits.HasTraits):

    s1=Simple(minimum=1.0,maximum=5.0)
    s2=Simple(minimum=2.0,maximum=10.0)
    s3=Simple(minimum=traits.Int(1.0),maximum=traits.Int(5.0))

    traits_view = traitsui.View(traitsui.Group(
    traitsui.Item('s1'),
    traitsui.Item('s2')
    ))

c= Complex()
c.configure_traits()

1 个答案:

答案 0 :(得分:1)

我已经用相同的结果测试了你的代码,但是当我想到这一点时,我意识到你使用Range的方法存在问题。必须使用trait_handlers.RangeType中的最小值和最大值定义范围类型的特征,其等于(int, long, float)。因此,您必须使用这些类型定义初始范围,除非您要替换traits.api.BaseRange,我认为这不是一个聪明的举动。因此,如果您希望将更改绑定到Simple.minimum和'Simple.maximum to the bounds of your Simple.ranged'特征,则必须坚持使用这些数据类型并执行更多手动工作。

请记住,在说明您在“构造函数”中定义Range值时,表示不正确。类的主体中变量的定义不是构造函数。您的远程特征定义为无效值,因为您尝试传递Traits对象而不是int,long或float。即使您要将Int特征转换为int值,请记住此时您正在处理类定义,而不是因为类还没有实例值在您定义Ranged的值时实例化。考虑到这一点,我在_init_类中添加了Simple方法(读取:构造函数)。

我已使用Traits UI Manual

中的add_trait方法进行了调整
from traits.api import HasTraits, Int, Range
from traitsui.api import View, Item

class Simple(HasTraits):
    minimum=Int()
    maximum=Int()
    ranged = Range(0, 0)

traits_view = View(
        Item('minimum'),
        Item('maximum'),
        Item('ranged'),
        resizable=True,width=600,height=400)

    def __init__(self, minimum=0, maximum=0, **traits):
        self.maximum = maximum
        self.minimum = minimum

        HasTraits.__init__(self, **traits)
        ranged = Range(self.minimum, self.maximum)
        self.remove_trait('ranged')
        self.add_trait('ranged', ranged)


    def _minimum_changed(self):
        self.remove_trait("ranged")
        ranged = Range(self.minimum, self.maximum)
        self.add_trait('ranged', ranged)


    def _maximum_changed(self):
        self.remove_trait("ranged")
        ranged = Range(self.minimum, self.maximum)
        self.add_trait('ranged', ranged)

c=Simple(minimum=1, maximum=5)
c.configure_traits()

如果您有任何后续问题,请与我们联系。

编辑:我已经学会了,因为这可以大大简化

来自traits.api的

导入HasTraits,Int,Range

class Simple(HasTraits):
    minimum=Int()
    maximum=Int()
    ranged = Range(low='minimum', high='maximum')

使用低和高的字符串值会导致api在后台链接这些特征,烘焙所有这些简单的味道。这显然是为此目的采用的更为简洁的习语。