TraitsUI TextEditor enter_set导致输入被拒绝

时间:2013-03-08 21:03:42

标签: python traits enthought traitsui

我正在尝试构建一个traitsui应用程序。作为此应用程序的一部分,我听一个用户输入的浮动。默认情况下,此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()

2 个答案:

答案 0 :(得分:3)

您可以使用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如何将字符串映射到特征值:

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

这是Traits UI设置Float的默认编辑器的方式。

答案 1 :(得分:0)

实际上,我弄清楚我自己的问题是什么,虽然我认为这不可避免地是编辑器工厂中的一个错误,但我确实有一个修复。

问题在于,当你进入文本编辑器时,比如字符串'4',编辑器将你的字符串解释为精确的字符串'4',而不是数字。如果你指定一个Int trait并让它使用它的默认编辑器,它必须做一些看不见的事情来将这个字符串转换为int(可能,它只是将函数int()指定为编辑器的'evaluate'属性)。

相反,如果您自己使用您感兴趣的参数修复程序指定编辑器,则会绕过此修复程序(这是TextEditor中的错误,或者如果您认为duck typing本身就是错误,则可能是python本身的错误) ,所以你必须自己提供修复(例如评估参数)。作为在一般情况下稍微容易的等效解决方案,请使用为此目的而创建的DefaultOverride工厂。