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.

Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from tkinter import ttk
import tkinter as tk


def is_valid_char(char):
    return char in "0123456789."


root = tk.Tk()
validatecommand = root.register(is_valid_char)
entry = ttk.Entry(root, validate="key", validatecommand=(validatecommand, "%S"))
entry.pack()
root.mainloop()

Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
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í:

Código:
from tkinter import ttk
import tkinter as tk


def is_valid_date(action, char, text):
    # Solo chequear cuando se añade un carácter.
    if action != "1":
        return True
    return char in "0123456789/" and len(text) < 10


root = tk.Tk()
validatecommand = root.register(is_valid_date)
entry = ttk.Entry(root, validate="key",
                  validatecommand=(validatecommand, "%d", "%S", "%s"))
entry.pack()
root.mainloop()

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

Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
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.

Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from tkinter import ttk
import tkinter as tk


def is_valid_char(char):
    return char in "0123456789."


root = tk.Tk()
validatecommand = root.register(is_valid_char)
entry = ttk.Entry(root, validate="key", validatecommand=(validatecommand, "%S"))
entry.pack()
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:

Código:
def is_valid_date(action, char, text):
    # Solo chequear cuando se añade un carácter.
    if action != "1":
        return True
    if len(char) + len(text) > 10:
        return False
    if len(char) > 1:
        # Si es más de un carácter, chequear uno por uno.
        return all(is_valid_date(action, c, text) for c in char)
    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
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#8
(30-01-2020, 02:29 AM)Francisco escribió: Creo que esta modificación podría funcionar:

Código:
def is_valid_date(action, char, text):
    # Solo chequear cuando se añade un carácter.
    if action != "1":
        return True
    if len(char) + len(text) > 10:
        return False
    if len(char) > 1:
        # Si es más de un carácter, chequear uno por uno.
        return all(is_valid_date(action, c, text) for c in char)
    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)