我正在尝试构建一个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()
答案 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工厂。