0

traitsui アプリケーションを構築しようとしています。このアプリケーションの一部として、ユーザーが入力する float をリッスンします。この float のデフォルトのエディターは、auto_set がオンになっている TextEditor です。しかし、ユーザーがこの数値の入力を終了すると、プログラムは長い計算を行うため、ユーザーが本当に 1.7 を入力したいときに、プログラムが新しい特性 1 をリッスンすると、非常に煩わしくなります。

TextEditor ファクトリの enter_set 属性を使用して、この問題を解決しようとしました。しかし、これを行うと、特性の更新がまったく許可されず、入力された値に関係なくボックスが赤で表示されます。これは明らかに、enter_set と auto_set が機能するはずの方法ではありません。私は何を間違っていますか?

ここに私のテストコードがあります:

from traits.api import *
from traitsui.api import *

class FloatEditorClass(HasTraits):
  f=Float
  click=Button('clickme')

  view=View(Item('f',editor=TextEditor(auto_set=False,enter_set=True)),
    # removing one or the other of these settings doesn't change anything
    Item(name='click'))

  def _click_fired(self):
    print self.f

fec=FloatEditorClass()
fec.configure_traits()
4

2 に答える 2

3

トレイトに割り当てた値をfloatに変換しようとするCFloatの代わりにを使用できます。Floatに文字列を割り当てようとFloatすると、タイプが間違っていることが検出されます。

例えば:

class CFloatDemo(HasTraits):
    f = Float
    cf = CFloat

demo = CFloatDemo()

demo.f = '3.0'  # This raises a TraitError
demo.cf = '3.0' # This assigns 3.0 to 'cf'

アップデート:

TextEditorもう1つのオプションは、文字列を特性値にマップする方法を指示することです。

traits_view=View(
   Item('f', editor=TextEditor(auto_set=False,enter_set=True, evaluate=float)),
   Item(name='click')
)

Floatこれは、TraitsUIによって デフォルトのエディタが設定される方法です。

于 2013-03-08T22:19:38.610 に答える
0

実際、私自身の問題が何であるかを突き止めました。これはエディタ ファクトリのバグであることは避けられないと主張しますが、修正方法があります。

問題は、たとえば文字列 '4' をテキスト エディタに入力すると、エディタが文字列を数字ではなく文字列 '4' と正確に解釈することです。Int トレイトを指定し、デフォルトのエディターを使用させる場合、この文字列を int に変換するために目に見えない何かを行う必要があります (おそらく、エディターの 'evaluate' 属性として関数 int() を指定するだけです)。

代わりに、関心のあるパラメーター修正を使用してエディターを自分で指定すると、この修正はバイパスされます (これは TextEditor のバグ、またはダック タイピングが本質的にエラーであると主張する場合は、おそらく python 自体のバグです)。自分で修正 (たとえば、評価パラメーター) を提供する必要があります。一般的なケースで少し簡単な同等のソリューションとして、代わりにこの目的のために作成された DefaultOverride ファクトリを使用します。

于 2013-03-08T21:30:24.743 に答える