2015-02-09 25 views
2

我在嘗試動態初始化特徵範圍對象時遇到了問題。動態初始化特徵範圍對象

下面的代碼是什麼,我試圖做一個很簡單的例子,但可悲的失敗,出現以下類型的錯誤:

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 =範圍(低= 0,高= 10),但當然我沒有得到我正在尋找範圍的高參數的動態初始化。

感謝您接受所有建議。

*後編輯喬納森的響應*

下面是使用喬納森的下面有幫助的建議,我的問題簡單的解決方案:

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

回答

3

您遇到性狀/ 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的解決方案。 :)

+0

感謝這個問題的精華沃倫的解釋。 如果你想要的範圍是真正的動態(不只是在初始化),那麼這是一個更好的解決方案 - 如沃倫的代碼示例說明。 – 2015-02-11 21:44:59

+0

是的,謝謝沃倫,這確實是一個更好的解決方案,因爲它允許在班級代碼內更新。我還沒有意識到,在創建對象時,可以使用傳遞的參數來初始化在類代碼開始處聲明的特徵對象。 – dreme 2015-02-13 01:12:49

+0

啊,但我發現只有在你的班級代碼中沒有__init__函數時才能使用這種傳遞參數。 – dreme 2015-02-13 01:29:50