Saltar al contenido

Validación interactiva del contenido del widget de entrada en tkinter

Bienvenido a nuestra página web, en este sitio hallarás la solucíon de lo que buscabas.

Solución:

La respuesta correcta es, usa el validatecommand attribute del widget. Desafortunadamente, esta característica está muy poco documentada en el mundo de Tkinter, aunque está suficientemente documentada en el mundo de Tk. Aunque no está bien documentado, tiene todo lo que necesita para realizar la validación sin recurrir a vinculaciones o variables de seguimiento, ni modificar el widget desde dentro del procedimiento de validación.

El truco es saber que puede hacer que Tkinter pase valores especiales a su comando de validación. Estos valores le brindan toda la información que necesita saber para decidir si los datos son válidos o no: el valor antes de la edición, el valor después de la edición si la edición es válida y varios otros bits de información. Sin embargo, para usarlos, debe hacer un poco de vudú para que esta información pase a su comando de validación.

Nota: es importante que el comando de validación devuelva True o False. Cualquier otra cosa hará que la validación se desactive para el widget.

Aquí hay un ejemplo que solo permite minúsculas. También imprime los valores de todos los valores especiales con fines ilustrativos. No todos son necesarios; rara vez necesita más de uno o dos.

import tkinter as tk  # python 3.x
# import Tkinter as tk # python 2.x

class Example(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        # valid percent substitutions (from the Tk entry man page)
        # note: you only have to register the ones you need; this
        # example registers them all for illustrative purposes
        #
        # %d = Type of action (1=insert, 0=delete, -1 for others)
        # %i = index of char string to be inserted/deleted, or -1
        # %P = value of the entry if the edit is allowed
        # %s = value of entry prior to editing
        # %S = the text string being inserted or deleted, if any
        # %v = the type of validation that is currently set
        # %V = the type of validation that triggered the callback
        #      (key, focusin, focusout, forced)
        # %W = the tk name of the widget

        vcmd = (self.register(self.onValidate),
                '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
        self.entry = tk.Entry(self, validate="key", validatecommand=vcmd)
        self.text = tk.Text(self, height=10, width=40)
        self.entry.pack(side="top", fill="x")
        self.text.pack(side="bottom", fill="both", expand=True)

    def onValidate(self, d, i, P, s, S, v, V, W):
        self.text.delete("1.0", "end")
        self.text.insert("end","OnValidate:n")
        self.text.insert("end","d='%s'n" % d)
        self.text.insert("end","i='%s'n" % i)
        self.text.insert("end","P='%s'n" % P)
        self.text.insert("end","s='%s'n" % s)
        self.text.insert("end","S='%s'n" % S)
        self.text.insert("end","v='%s'n" % v)
        self.text.insert("end","V='%s'n" % V)
        self.text.insert("end","W='%s'n" % W)

        # Disallow anything but lowercase letters
        if S == S.lower():
            return True
        else:
            self.bell()
            return False

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

Para obtener más información sobre lo que sucede debajo del capó cuando llama al register método, consulte ¿Por qué se requiere llamar a register() para la validación de entrada de tkinter?

Para ver la documentación canónica, consulte la sección Validación de la página del comando man Tcl/Tk Entry.

Después de estudiar y experimentar con el código de Bryan, produje una versión mínima de validación de entrada. El siguiente código colocará un cuadro de entrada y solo aceptará dígitos numéricos.

from tkinter import *

root = Tk()

def testVal(inStr,acttyp):
    if acttyp == '1': #insert
        if not inStr.isdigit():
            return False
    return True

entry = Entry(root, validate="key")
entry['validatecommand'] = (entry.register(testVal),'%P','%d')
entry.pack()

root.mainloop()

Tal vez debería agregar que todavía estoy aprendiendo Python y con gusto aceptaré todos los comentarios/sugerencias.

Utilizar una Tkinter.StringVar para realizar un seguimiento del valor del widget de entrada. Puede validar el valor de la StringVar estableciendo un trace en eso.

Aquí hay un programa de trabajo corto que acepta solo flotantes válidos en el widget de Entrada.

from Tkinter import *
root = Tk()
sv = StringVar()

def validate_float(var):
    new_value = var.get()
    try:
        new_value == '' or float(new_value)
        validate.old_value = new_value
    except:
        var.set(validate.old_value)    
validate.old_value = ''

# trace wants a callback with nearly useless parameters, fixing with lambda.
sv.trace('w', lambda nm, idx, mode, var=sv: validate_float(var))
ent = Entry(root, textvariable=sv)
ent.pack()

root.mainloop()

Te mostramos las reseñas y valoraciones de los usuarios

Tienes la opción de corroborar nuestra faena escribiendo un comentario o dejando una valoración te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *