我正在尝试创建一个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()
答案 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在后台链接这些特征,烘焙所有这些简单的味道。这显然是为此目的采用的更为简洁的习语。