Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[tkinter] Ante un ingreso invalido hacer que el entry no pierda el foco.
#1
Hola gente, ¿cómo están?, hola Francisco, les comento lo que no puedo lograr,
tengo que validar el ingreso de fecha en una caja de texto, al parecer todo bien
pero lo que pasa es que la caja esta en un modulo y la función de validación
en otro, lo que quiero es que antes un ingreso incorrecto la caja no pierda el foco.-
Estuve investigando sobre los parámetros que lleva validatecommand a la función,
tal vez allí este la solución pero no se como hacerlo.-

Código:
# Cajas de texto
varFecha = tk.StringVar(value=ultimoRegistros[1])
fechaEntry = tk.Entry(root, state="readonly", textvariable=varFecha, font=("Verdana", 11),
    validate="focusout", validatecommand=(root.register(Funciones.validarFecha), "%P"))
fechaEntry.place(x=28, y=39, width=100, height=27)


def validarFecha(fecha):
    try:
        fecha = datetime.strptime(fecha, '%d/%m/%Y')
        return True
    except ValueError:
        mensaje = f'{fecha} --> no es una fecha válida'
        messagebox.showerror(message=mensaje, title="Fecha no valida.")
        return False

Desde ya muchas gracia.-
Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#2
Hola, Daniel.

Tenés validate="focusout", por lo cual la validación se va a ejecutar cuando la caja de texto pierda el foco. Lo que podés hacer es forzar a que el foco vuelva a la caja de texto luego de mostrar el mensaje de error:

  1. def validarFecha(fecha):
  2. try:
  3. fecha = datetime.strptime(fecha, '%d/%m/%Y')
  4. return True
  5. except ValueError:
  6. mensaje = f'{fecha} --> no es una fecha válida'
  7. messagebox.showerror(message=mensaje, title="Fecha no valida.")
  8. fechaEntry.focus() # Devolver el foco a la caja de texto.
  9. return False


Saludos
Responder
#3
Hola Francisco, que tengas un muy buen día, pongo mas abajo el error
que me da, focus() ya lo utilice en muchas ocasiones pero en este caso
me pone “NameError: el nombre 'fechaEntry' no esta definido”
Por eso te preguntaba sobre pasar parámetros, en otro modulo
¿Cómo se entera la función de la existencia de “fechaEntry”?.-
Bueno espero puedas ayudarme a encontrar la solución.-
----------------------------------------------------------------------------
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Daniel Virgili\AppData\Local\Programs\Thonny\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Users\Daniel Virgili\Desktop\Python\ProyectoCajadeAhorro\CajaDeAhorro\Funciones.py", line 13, in validarFecha
    fechaEntry.focus()
NameError: name 'fechaEntry' is not defined
----------------------------------------------------------------------------
Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#4
Hola, Daniel.

En ese caso deberías usar functools.partial() para pasar la caja de texto como argumento. Sería algo así:

  1. from functools import partial
  2. # [...]
  3. fechaEntry = tk.Entry(root, state="readonly", textvariable=varFecha, font=("Verdana", 11), validate="focusout")
  4. # Hay que hacerlo en un paso posterior para que la variable esté creada.
  5. fechaEntry.config(validatecommand=(root.register(partial(Funciones.validarFecha, fechaEntry)), "%P"))


Luego asegurate de recibirla como argumento:

  1. def validarFecha(fechaEntry, fecha):
  2. # [...]


Saludos
Responder
#5
Francisco, como era de esperar funciona a la perfección, ahora si puedo continuar,
muchas gracias, dentro de un tiempo te paso mi CVU(¿o era lo contrario?) Huh Huh Huh Big Grin Big Grin Big Grin

Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)