Traits Range 对象的动态初始化
Dynamic initialization of Traits Range object
我在尝试动态初始化 Traits Range 对象时遇到问题。
以下代码是我正在尝试做的一个非常简单的示例,但不幸的是失败并出现以下类型错误:
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 = Range(low=0, high=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()
一种方法是不以通常的方式定义特征,而是在 __init__
内,因此:
self.add_trait("R", Range(0, N))
见http://docs.enthought.com/traits/traits_user_manual/advanced.html#per-object-trait-attributes
您遇到 Traits/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 的解决方案。 :)
我在尝试动态初始化 Traits Range 对象时遇到问题。
以下代码是我正在尝试做的一个非常简单的示例,但不幸的是失败并出现以下类型错误:
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 = Range(low=0, high=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()
一种方法是不以通常的方式定义特征,而是在 __init__
内,因此:
self.add_trait("R", Range(0, N))
见http://docs.enthought.com/traits/traits_user_manual/advanced.html#per-object-trait-attributes
您遇到 Traits/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 的解决方案。 :)