我在尝试动态初始化Traits 范围对象时遇到了问题。
以下代码是我正在尝试做的一个非常简单的示例,但遗憾的是失败并出现以下类型错误:
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'的定义替换为:R = Range(低= 0,高= 10 ),则代码有效,但当然我没有得到动态初始化我想要的Range的高参数。
感谢所有建议。
*在Jonathan的回复之后编辑*
以下是使用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()
答案 0 :(得分:5)
一种方法是不以通常的方式定义特征,而是在__init__
内,因此:
self.add_trait("R", Range(0, N))
请参阅http://docs.enthought.com/traits/traits_user_manual/advanced.html#per-object-trait-attributes
答案 1 :(得分:3)
您遇到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的解决方案。 :)