簡體   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