Python: ¿Cómo obtener un texto de entrada actualizado para utilizar en un comando binded a ella?
-
28-09-2019 - |
Pregunta
Considere el siguiente código:
text = Entry(); text.pack()
def show(e):
print text.get()
text.bind('<Key>', show)
Vamos a decir que puso las letras ABC en la entrada, una por una. La salida sería:
>>>
>>> A
>>> AB
Tenga en cuenta que al pulsar A, se imprime una cadena vacía. Cuando presiono B, imprime A, AB no. Si no lo hago nada después pulse C, nunca se mostrará. Parece que el contenido de entrada sólo se actualiza después de que ha vuelto el comando encuadernados, así que no puedo utilizar el valor de la entrada real en esa función.
¿Hay alguna manera de obtener un valor de entrada actualizado para utilizar dentro de un comando Binded?
Solución
Se podría reemplazar el evento <Key>
con el evento <KeyRelease>
. Eso debería funcionar.
A continuación se muestra una lista de eventos: http: / /infohost.nmt.edu/tcc/help/pubs/tkinter/events.html#event-types
Otros consejos
La razón de esto tiene que ver con Tk "bindtags". Los enlaces se asocian con las etiquetas, y las ataduras se procesan en orden etiqueta. Ambos nombres widget y clases de widgets son etiquetas, y se procesan en ese orden (fijaciones de widgets específicos primeros, encuadernaciones segunda clase).
Por esa razón, cada vez que pulse una tecla específica de su widget de unión se disparará antes de la clase de unión tiene la oportunidad de modificar el widget.
Hay muchas soluciones. La más sencilla es que se unen a <KeyRelease>
desde los enlaces de clase ocurren en la pulsación de tecla. Hay otras soluciones que implican ya sea agregando o cambiando las etiquetas se unen, o utilizando el incorporado en funciones de validación de los datos del widget de entrada. ¿Qué es mejor depende de lo que realmente está tratando de lograr.
Para obtener más información sobre las funciones de validación de datos, consulte la siguiente pregunta: interactiva validación contenido de control de entrada de tkinter
Para obtener una respuesta más completa, ver Tkinter: Conjunto VarCadena después