TraitsUI TextEditor enter_set hace que se rechace la entrada

Estoy tratando de construir una aplicación traitsui. Como parte de esta aplicación, escucho un flotador que ingresa el usuario. El editor de este flotante por defecto es un TextEditor con auto_set activado. Sin embargo, cuando el usuario termina de ingresar este número, el programa realiza un cálculo largo, por lo que es realmente molesto cuando el programa escucha el nuevo rasgo 1 cuando el usuario realmente quería ingresar 1.7.

Traté de resolver este problema con el atributo enter_set de la fábrica TextEditor. Pero, cuando hago esto, no permite que el rasgo se actualice en absoluto y el cuadro aparece en rojo sin importar el valor que se ingrese. Claramente, no es así como se supone que funcionan enter_set y auto_set. ¿Qué estoy haciendo mal?

Aquí está mi código de prueba:

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()

preguntado el 08 de marzo de 13 a las 21:03

2 Respuestas

Puedes usar CFloat en lugar de Float, que intenta transformar el valor que le asignas al rasgo para que flote. Si intenta asignar una cadena a Float, detecta que el tipo es incorrecto.

Por ejemplo:

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'

Actualizar:

La otra opción es decirle al TextEditor cómo asignar la cadena al valor de los rasgos:

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

Así es como funciona el editor predeterminado para Float está configurado por Traits UI.

respondido 08 mar '13, 22:03

Otra alternativa (pero es fea): declarar el rasgo como f = Float(enter_set=True, auto_set=False)y use el editor predeterminado en la Vista (es decir, Item('f')). Funciona, pero incorpora información de la interfaz de usuario en el modelo. - warren weckesser

En realidad, descubrí cuál era mi propio problema y, aunque diría que es inevitablemente un error en la fábrica del editor, tengo una solución.

El problema es que cuando ingresa a un editor de texto, diga la cadena '4', el editor interpreta su cadena precisamente como esto, la cadena '4' y no el número. Si especifica un rasgo Int y le permite usar su editor predeterminado, debe hacer algo invisible para convertir esta cadena en un int (probablemente, solo especifica la función int() como el atributo 'evaluar' del editor).

En cambio, si usted mismo especifica el editor con las correcciones de parámetros que le interesan, esta corrección se omite (que es un error en TextEditor, o quizás un error de python en sí mismo si argumenta que escribir pato es inherentemente un error), por lo que tiene que proporcionar la solución (por ejemplo, el parámetro de evaluación) usted mismo. Como una solución equivalente que es un poco más fácil en el caso general, use la fábrica DefaultOverride en su lugar, que se creó para este propósito.

respondido 08 mar '13, 21:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.