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'))