0

我正在尝试构建一个 traitsui 应用程序。作为此应用程序的一部分,我会监听用户输入的浮点数。默认情况下,此浮动的编辑器是一个带有 auto_set 的 TextEditor。但是,当用户输入完这个数字后,程序会进行很长的计算,所以当用户真正想输入 1.7 时,当程序监听新的 trait 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

您可以使用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')
)

这就是FloatTraits UI 设置默认编辑器的方式。

于 2013-03-08T22:19:38.610 回答
0

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

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

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

于 2013-03-08T21:30:24.743 回答