widgets delete python events widget tkinter

delete - widget text en python



Ayuda con el evento<key> en el widget de entrada de python (2)

Estoy escribiendo un código en python y estoy teniendo problemas al tratar de recuperar el contenido de un widget de entrada. Lo que pasa es que quiero limitar los caracteres que pueden escribirse, así que trato de borrar el widget Entry cuando alcanzo el número específico de caracteres (2 en este caso), pero parece que siempre extraño el último tipeado personaje. Añadí el personaje perdido en una impresión para mostrar.

Aquí está el código de muestra:

from Tkinter import * class sampleFrame: def __init__(self, master): self.__frame = Frame(master) self.__frame.pack() def get_frame(self): return self.__frame class sampleClass: def __init__(self, master): self.__aLabel = Label(master,text="aLabel", width=10) self.__aLabel.pack(side=LEFT) self.__aEntry = Entry (master, width=2) self.__aEntry.bind(''<Key>'', lambda event: self.callback(event, self.__aEntry)) self.__aEntry.pack(side=LEFT) def callback(self, event, widgetName): self.__value = widgetName.get()+event.char print self.__value if len(self.__value)>2: widgetName.delete(2,4) root = Tk() aSampleFrame = sampleFrame(root) aSampleClass = sampleClass(aSampleFrame.get_frame()) root.mainloop()

¡Cualquier ayuda será muy apreciada!

Gracias por adelantado


Al principio, después de hacer la eliminación, el evento continúa con su procesamiento normal, es decir, el personaje se inserta. Debes indicarle a Tkinter que el evento debe ignorarse.

Entonces, en su código anterior, agregue la línea marcada:

if len(self.__value) > 2: widgetName.delete(2,4) return "break" # add this line

Por otro lado, ¿por qué atraviesas la lambda? Un evento tiene un atributo .widget que puede usar. Entonces puedes cambiar tu código a:

self.__aEntry.bind(''<Key>'', self.callback) # ※ here! self.__aEntry.pack(side=LEFT) def callback(self, event): self.__value = event.widget.get()+event.char # ※ here! print self.__value if len(self.__value)>2: event.widget.delete(2,4) # ※ here! return "break"

Todas las líneas modificadas están marcadas con "¡aquí!"


Para ser un poco más específico, los widgets Tk tienen lo que se llaman "bindtags". Cuando se procesa un evento, se considera cada etiqueta de enlace en el widget para ver si tiene un enlace. Un widget de forma predeterminada tendrá como bindtags el widget, la clase de widget, el widget raíz y "todos". Por lo tanto, los enlaces al widget se producirán antes de los enlaces predeterminados. Una vez que se haya procesado su encuadernación, puede evitar que se consideren más bindtags devolviendo un "corte".

Las ramificaciones son las siguientes: si realiza un enlace en el widget, la clase, la ventana raíz y los enlaces "todos" también pueden desencadenarse. Además, cualquier enlace que adjunte al widget se dispara antes del enlace de clase, que es donde ocurre el comportamiento predeterminado (por ejemplo, la inserción de un personaje). Es importante tenerlo en cuenta en situaciones donde es posible que desee manejar el evento después del comportamiento predeterminado en lugar de hacerlo antes.