2016-10-12 1 views
1

RangeEditorは浮動小数点の特性を期待するために配線されているようです。次のサンプルスクリプトは動作を示しています。整数特性に対してRangeEditorを指定するよりクリーンな方法はありますか? RangeEditor整数のための予期しないRangeEditor

import sys 
print (sys.version) # '3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)]' 
from traits import __version__ 
print (__version__) # '4.6.0.dev0' 

from traits.api import HasTraits, Int, Range 
from traitsui.api import Item, RangeEditor, View 

class Exposure (HasTraits): 

    duration = Range (low=0.0, high=3600.0, exclude_low=True , exclude_high=False, editor=RangeEditor(mode='slider')) 
    min_count = Int ( 1) 
    max_count = Int (10000) 
    #<1>count = Range (low=1 , high=10000 , exclude_low=False, exclude_high=False, editor=RangeEditor(mode='slider')) 
    count  = Range (low=1 , high=10000 , exclude_low=False, exclude_high=False, editor=RangeEditor(mode='slider', low_name='min_count', high_name='max_count')) 
    traits_view = View (Item('duration'), Item('count'), buttons=['OK', 'Cancel']) 
exposure = Exposure (duration = 0.00032, count=1500) 
exposure.configure_traits() 

# Specifying `count` as per <1>, above, raises the following exception: 
# traits.trait_errors.TraitError: The 'count' trait of an Exposure instance must be 1 <= a long integer <= 10000, but a value of 1.0 <class 'float'> was specified. 
# 
# A work-around is to declare min_count and max_count, and include them in the 
# RangeEditor definition of `count`. Note, I am now duplicating `count` low and 
# high limits in 2 places. Is there a better approach? 

答えて

2

は確かにあなたがint値にhighまたはlowパラメータを設定して、デフォルトを上書きしない限り、float値を返すにデフォルトありません。 Range形質のlowおよびhighパラメータは、形質のデフォルトエディタ(see the source here)に渡されないため、別々に設定する必要があります。 (なぜ、low_namehigh_nameになったのかを出典から明らかにする必要があります)。IIUC、これは特性を意図的に切り離したものですが、Traitの問題を行動は異なるはずです。

コードを明確にするのに役立つものは、モデルとビューの定義を分けることです。あなたの特性定義でエディタを指定すると、簡単にw.r.t.形質のパラメーターとその見方値の制約がExposureモデル固有のものである場合は、Rangeを使用してください。それ以外の場合は、基になる特性タイプを使用してください。別々にビューを定義することで、モデルに属する制約とビューに属する制約が明確になります。また、異なる制約で2番目のビューを定義したい場合は、そうすることは問題ありません。

は、ここで私はあなたのコードを再書き込み提案する方法は、次のとおりです。詳細な応答のための

from traits.api import HasTraits, Int, Range 
from traitsui.api import Item, RangeEditor, View 

class Exposure (HasTraits): 

    duration = Range (low=0.0, high=3600.0, exclude_low=True , exclude_high=False) 
    count  = Int(1500) 

my_view = View(
    Item('duration', editor=RangeEditor(mode='slider')), 
    Item('count', editor=RangeEditor(low=1, high=10000, mode='slider')), 
    buttons=['OK', 'Cancel'] 
) 
exposure = Exposure (duration = 0.00032, count=1500) 
exposure.configure_traits(view=my_view) 
+0

感謝。私は本当に 'count'を制約を適用する範囲にしたいと思っています。また、 'duration'のItem指定には、低い値と高い値を含める必要があります。それ以外の場合、RangeEditorは[0.0、1.0]のスライダを表示します。私はMVCを理解していますが、(モデル)特性宣言と(ビュー)RangeEditor宣言(DRY IMHOの違反)の両方で、Range lowとhighを指定する必要がありますが、私はそれらを(モデル)クラス定義。 –

+0

OK。 'count'をさらに変更することなく' Range'特性に変更することは問題ではありません。私はあなたのDRY不快感に同意する傾向があります。私は現在の行動が意図的だと思うが、確かにそれを知らない。 –

+0

私はちょうど同じ問題に直面しています。 RangeEditorは、編集された特性が整数か浮動かを判断するのに十分なほど賢明でなければならないと私は同意します。 –

関連する問題