0

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

我在下面制作了一个产生错误的简单示例。有人可以解释最好的方法吗?-我不知道什么时候应该使用 traits.Instance(traits.Int) 或仅使用 traits.Int -如何在构造函数中为特征传递初始值?每当我这样做时,我都会收到诸如“type int required but found type 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()
4

1 回答 1

1

我已经用相同的结果测试了您的代码,但是当我想到这一点时,我意识到您使用 Range 的方式存在问题。trait_handlers.RangeTypeRange 类型的特征必须使用等于的最小值和最大值定义(int, long, float)。因此,您必须使用这些类型定义初始范围,除非您想替换traits.api.BaseRange,我认为这不是明智之举。因此,如果您想将更改Simple.minimum与“Simple.maximum to the bounds of yourSimple.ranged”特征联系起来,您将不得不坚持使用这些数据类型,并做更多的手动工作。

请记住,您在“构造函数”中定义范围值是不正确的。类主体中的变量定义不是构造函数。您的范围特征是用无效值定义的,因为您试图传递一个 Traits 对象,而不是一个 int、long 或 float。即使您要将Inttrait 转换为int值,请记住,此时您正在处理类定义,而不是实例值,因为在您定义范围的值。考虑到这一点,我在类中添加了一个_init_方法(阅读:构造函数)Simple

我已经适应了Traits UI Manualadd_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')

使用 low 和 high 的字符串值会导致 api 在后台链接这些特征,从而以所有简单的方式烘焙。这显然是为此目的采用的更简洁的习语。

于 2014-11-17T18:56:35.440 回答