Separando y asociando datos e interfaz gráfica (BooleanVar, DoubleVar, IntVar, StringVar)

tkinter define la clase Variable, con la que podemos declarar variables que registra el sistema de modo que podamos saber cuándo se ha leído, escrito o cambiado. Las variables de Python no tienen esta característica, el desarrollador decide cuándo se lee, escribe o modifica una variable, por ejemplo cuando se pide al usuario un número entero es el desarrollador quien ha de comprobar si el usuario realmente ha introducido un número entero. Sin embargo, tkinter.Variable tiene una traza que puede ser utilizada en cualquier parte del desarrollo.

Esta clase tiene las subclases StringVar, IntVar, DoubleVar y BooleanVar, que restringen el valor devuelto por su método get(). Los métodos de tkinter.Variable son:

__del__(self)
__eq__(self, other)
__init__(self, master=None, value=None, name=None)
__str__(self)
get(self)
initialize = set(self, value)
set(self, value)
trace = trace_variable(self, mode, callback)
trace_add(self, mode, callback)
trace_info(self)
trace_remove(self, mode, cbname)
trace_variable(self, mode, callback)
trace_vdelete(self, mode, cbname)
trace_vinfo(self)

Lo widgets de entrada de texto suelen usar una variable de este tipo para controlar su contenido, facilitando la labor de validar el texto introducido por el usuario --comprobando, por ejemplo, si se trata realmente de un número en coma flotante. Si se asocian a etiquetas basta con cambiar el valor de la variable para que la etiqueta muestre otro contenido. Las casillas de verificación y de selección necesitan estas variables para hacer correctamente su trabajo.

StringVar

Los widgets de tkinter se pueden asociar a una variable de texto.

texto = tkinter.StringVar()

A la que podemos asignar valor con la opción value del constructor:

texto = tkinter.StringVar(value='Texto')

Y de la que podemos leer su valor con el método get:

print(texto.get())

Para cambiar su valor podemos usar su método set

texto.set('Nuevo texto')

Para asociarla a un widget basta con indicarlo en el atributo textvariable del widget

txt_entrada = tk.Entry(v_principal, textvariable=texto)

IntVar

Esta clase devuelve un valor de tipo int.

DoubleVar

Esta clase devuelve un valor de tipo double.

BooleanVar

Esta clase devuelve un valor de tipo booleano.

Validando entradas

A pesar de vincular una entrada de texto a un número de coma flotante no se impide que el usuario ingrese un texto que no pueda ser interpretado como float. Para conseguirlo se ha de crear una función que haga la comprobación y la valide devolviendo True o impida que se lleve a cabo el cambio de texto sugerido por el usuario, devolviendo False. Como esta función recibe parámetros y queremos vincularla a la entrada de texto, se ha de registrar antes la función, que se vinculará al widget mediante su atributo validatecommand y una tupla con el nombre de la función registrada y los parámetros que queremos enviar. El atributo validate del widget puede tomar los valores 'focus', 'focusin', 'focusout', 'key', 'all' o 'none', indicando qué eventos llaman a la función indicada en el atributo validatecommand.

def esDouble(nuevo_valor, evento):
    if evento == 'focusout' and not nuevo_valor:
        euros.set(1.00)
        return True

    if not nuevo_valor:
        pass
        return True

    try:
        float(nuevo_valor)
    except ValueError:
        return False

    return True


okayCommand = v_principal.register(esDouble)

euros = tk.DoubleVar()
euros.set(1.00)
txt_euros = tk.Entry(v_principal, textvariable=euros, validate='all', 
                     validatecommand=(okayCommand, '%P', '%V'))

Referencias

results matching ""

    No results matching ""