繁体   English   中英

Traits Range对象的动态初始化

[英]Dynamic initialization of Traits Range object

我在尝试动态初始化Traits Range对象时遇到了麻烦。

下面的代码是我正在尝试做的一个非常简单的示例,但遗憾的是出现以下类型错误:

TypeError:不支持的操作数类型 - :'int'和'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 = Range(低= 0, 高= 10 )替换'R'的定义,代码就有效,但当然我没有得到我正在寻找的Range高参数的动态初始化。

感谢所有建议。

*乔纳森回应后编辑*

以下是使用Jonathan的有用建议解决我问题的简单方法:

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()

一种方法是不按常规方式定义特征,而是在__init__内定义特征,因此:

    self.add_trait("R", Range(0, N))

请参阅http://docs.enthought.com/traits/traits_user_manual/advanced.html#per-object-trait-attributes

您遇到Traits / TraitsUI错误:

解决方法是为低端创建另一个Trait:

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的解决方案。 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM