2015-02-09 56 views
2

我在尝试动态初始化特征范围对象时遇到了问题。动态初始化特征范围对象

下面的代码是什么,我试图做一个很简单的例子,但可悲的失败,出现以下类型的错误:

TypeError: unsupported operand type(s) for -: 'int' and 'code'

from traits.api import HasTraits, Int, Range 
from traitsui.api import View, Item 

class DynamicRange(HasTraits): 
    """Dynamic initialisation of a Range object""" 
    N = Int() 
    R = Range(low=0, high='N') 

    traits_view = View(Item('R'), Item('N')) 

    def __init__(self, N): 
     self.N = N   # initial parameter value for N 

    def _N_default(self): 
     return self.N 

Robject = DynamicRange(N=10) 
Robject.configure_traits() 

代码工作,如果我取代的“的定义R'与:R =范围(低= 0,高= 10),但当然我没有得到我正在寻找范围的高参数的动态初始化。

感谢您接受所有建议。

*后编辑乔纳森的响应*

下面是使用乔纳森的下面有帮助的建议,我的问题简单的解决方案:

from traits.api import HasTraits, Range 
from traitsui.api import View, Item 

class DynamicRange(HasTraits): 
    """Dynamic initialisation of a Range object""" 
    traits_view = View(Item('R')) 

    def __init__(self, N): 
     self.add_trait("R", Range(0, N)) 

Robject = DynamicRange(N=30) 
Robject.configure_traits() 

回答

3

您遇到性状/ TraitsUI错误:

一个解决办法是创建低端的另一个特点:

from traits.api import HasTraits, Int, Range 
from traitsui.api import View, Item 


class DynamicRange(HasTraits): 
    """Dynamic initialisation of a Range object""" 

    # Upper limit of R 
    N = Int() 

    # Lower limit of R (not exposed to the user) 
    _zero = Int(value=0) 

    R = Range(low='_zero', high='N') 

    traits_view = View(Item('R'), Item('N')) 


Robject = DynamicRange(N=10) 
Robject.configure_traits() 

或使用@ JonathanMarch的解决方案。 :)

+0

感谢这个问题的精华沃伦的解释。 如果你想要的范围是真正的动态(不只是在初始化),那么这是一个更好的解决方案 - 如沃伦的代码示例说明。 – 2015-02-11 21:44:59

+0

是的,谢谢沃伦,这确实是一个更好的解决方案,因为它允许在班级代码内更新。我还没有意识到,在创建对象时,可以使用传递的参数来初始化在类代码开始处声明的特征对象。 – dreme 2015-02-13 01:12:49

+0

啊,但我发现只有在你的班级代码中没有__init__函数时才能使用这种传递参数。 – dreme 2015-02-13 01:29:50