Pregunta

Estoy escribiendo algún código en python y tengo problemas al intentar recuperar el contenido de un widget de entrada. La cosa es: quiero limitar los caracteres que se pueden escribir, así que estoy tratando de borrar el widget de Entrada cuando llego al número específico de caracteres (2 en este caso), pero parece que siempre falto el último tipo escrito personaje. Agregué el carácter perdido en una impresión para mostrar.

Aquí está el código de ejemplo:

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 de antemano

¿Fue útil?

Solución

Al principio, después de hacer la eliminación, el evento continúa con su procesamiento normal, es decir, se inserta el carácter. Debe 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é pasas por la lambda? Un evento tiene un atributo .widget que puedes usar. Para que pueda cambiar su código en:

    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í! "

Otros consejos

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top