性状范围对象的动态初始化

2024-06-16 16:10:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试动态初始化Traits范围对象时遇到了困难。在

下面的代码是一个非常简单的示例,但遗憾的是,由于以下类型错误而失败:

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(低=0,high=10),那么代码就可以工作了,但是当然,我没有得到我要寻找的Range的high参数的动态初始化。在

所有的建议都接受了。在

*在乔纳森回复后编辑*

以下是利用乔纳森的有用建议对我的问题给出的简单解决方案:

^{pr2}$

Tags: 代码fromimportselfviewapifor动态
2条回答

你正在经历一个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的解决方案。:)

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

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

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

相关问题 更多 >