Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Validacion campo Entry - Solo Numeros
#1
Buenas, tengo un control de tipo Entry, y quiero validar o controlar que solamente se introduzcan numeros o un punto, por ejemplo los caracteres aceptados serian [0,1,2,3,4,5,6,7,8,9,.]

Como puedo hacerlo?

Gracias, un saludo.
Responder
#2
Hola Alfredo. Puedes usar el argumento validatecommand para pasar una función que chequee si cada carácter agregado es válido.

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from tkinter import ttk
  5. import tkinter as tk
  6.  
  7.  
  8. def is_valid_char(char):
  9. return char in "0123456789."
  10.  
  11.  
  12. root = tk.Tk()
  13. validatecommand = root.register(is_valid_char)
  14. entry = ttk.Entry(root, validate="key", validatecommand=(validatecommand, "%S"))
  15. entry.pack()
  16. root.mainloop()


Saludos!
Responder
#3
Muchas gracias Francisco, y para que en un campo ENTRY solamente pueda introducir un cierto numero de caracteres? Por ejemplo para una fecha en formato mm/dd/yyyy solo me debería dejar introducir numeros y barras, EJ: 01/01/2018 y como máximo un total de 10 caracteres.

Gracias por la ayuda Francisco, un saludo.
Responder
#4
De nada. Podría ser algo así:

  1. from tkinter import ttk
  2. import tkinter as tk
  3.  
  4.  
  5. def is_valid_date(action, char, text):
  6. # Solo chequear cuando se añade un carácter.
  7. if action != "1":
  8. return True
  9. return char in "0123456789/" and len(text) < 10
  10.  
  11.  
  12. root = tk.Tk()
  13. validatecommand = root.register(is_valid_date)
  14. entry = ttk.Entry(root, validate="key",
  15. validatecommand=(validatecommand, "%d", "%S", "%s"))
  16. entry.pack()
  17. root.mainloop()


Tienes la referencia sobre los parámetros en este enlace.

Saludos!
Responder
#5
Muchísimas gracias !!
Responder
#6
(22-06-2018, 12:54 PM)Francisco escribió: Hola Alfredo. Puedes usar el argumento validatecommand para pasar una función que chequee si cada carácter agregado es válido.

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from tkinter import ttk
  5. import tkinter as tk
  6.  
  7.  
  8. def is_valid_char(char):
  9.     return char in "0123456789."
  10.  
  11.  
  12. root = tk.Tk()
  13. validatecommand = root.register(is_valid_char)
  14. entry = ttk.Entry(root, validate="key", validatecommand=(validatecommand, "%S"))
  15. entry.pack()
  16. root.mainloop()


Saludos!

Hola muy buen código pero ahora que lo implemente no puedo usar el copiar pegar y cortarctrl+c ctrl+v etc. Que tendría que modificar. Gracias
Responder
#7
Creo que esta modificación podría funcionar:

  1. def is_valid_date(action, char, text):
  2. # Solo chequear cuando se añade un carácter.
  3. if action != "1":
  4. return True
  5. if len(char) + len(text) > 10:
  6. return False
  7. if len(char) > 1:
  8. # Si es más de un carácter, chequear uno por uno.
  9. return all(is_valid_date(action, c, text) for c in char)
  10. return char in "0123456789/"


Para referencia de la función all(): https://micro.recursospython.com/recurso...n-all.html. Y sobre la comprensión de colecciones (línea 9): https://recursospython.com/guias-y-manua...lecciones/.

Saludos
Responder
#8
(30-01-2020, 02:29 AM)Francisco escribió: Creo que esta modificación podría funcionar:

  1. def is_valid_date(action, char, text):
  2.     # Solo chequear cuando se añade un carácter.
  3.     if action != "1":
  4.         return True
  5.     if len(char) + len(text) > 10:
  6.         return False
  7.     if len(char) > 1:
  8.         # Si es más de un carácter, chequear uno por uno.
  9.         return all(is_valid_date(action, c, text) for c in char)
  10.     return char in "0123456789/"


Para referencia de la función all(): https://micro.recursospython.com/recurso...n-all.html. Y sobre la comprensión de colecciones (línea 9): https://recursospython.com/guias-y-manua...lecciones/.

Saludos

Funciona muy bien, muchas gracias Francisco
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)