Menu
«Checkbox»
(Checkbutton) en
Tcl/Tk (tkinter)
marzo 9, 2017 by Recursos Python Dejar un
comentario
Nota: este artículo se aplica a la clase
ttk.Checkbutton , introducida en Tk 8.5.
El control ttk.Checkbutton , también conocido
en la jerga como «Checkbox», es un tipo de
botón que permite representar dos estados
opuestos (activado/desactivado,
encendido/apagado, sí/no, etc.) o bien un estado
indeterminado.
El siguiente código crea un checkbox con el
texto «Opción» como se muestra en la imagen
anterior.
1. #!/usr/bin/env python
2. # -*- coding: utf-8 -*-
3.
4. import tkinter as tk
5. from tkinter import ttk
6.
7. class Application(ttk.Frame):
8.
9. def __init__(self, main_window):
10. super().__init__(main_window)
11. main_window.title("Checkbutton
en tkinter")
12.
13. self.checkbox =
ttk.Checkbutton(self, text="Opción")
14. self.checkbox.place(x=40, y=70)
15.
16. self.place(width=300,
height=200)
17.
18. main_window = tk.Tk()
19. app = Application(main_window)
20. app.mainloop()
Nótese, sin embargo, que el control se inicializa
con un estado indeterminado. Para poder
obtener acceso al estado de un checkbox
primero es necesario crear una variable que
pueda almacenar su valor.
Por conveniencia utilizamos tk.BooleanVar ,
que representará el estado «activado» como
True y «desactivado» como False .
Compra en línea a MSI.
Chedraui®
1. self.checkbox_value =
tk.BooleanVar(self)
2. self.checkbox =
ttk.Checkbutton(self,
3. text="Opción",
variable=self.checkbox_value)
Por defecto, tk.BooleanVar se inicializa con el
valor False , por lo que inicialmente el control
no está chequeado.
Ahora podemos establcer u obtener el estado
leyendo el valor de la variable con las funciones
set() y get() , respectivamente. Por ejemplo,
el siguiente código utiliza el parámetro command
para imprimir el valor del control cada vez que
éste es presionado.
1. self.checkbox_value =
tk.BooleanVar(self)
2. self.checkbox =
ttk.Checkbutton(self,
3. text="Opción",
4.
variable=self.checkbox_value,
5.
command=self.checkbox_clicked)
6. self.checkbox.place(x=40, y=70)
7.
8. self.place(width=300,
height=200)
9.
10. def checkbox_clicked(self):
11. print(self.checkbox_value.get())
De la misma forma, si quisiéramos inicializar el
control con un valor positivo, podemos utilizar:
1. self.checkbox_value =
tk.BooleanVar(self)
2. self.checkbox_value.set(True)
Podemos simular un cambio de estado en el
control empleando la función invoke . Una
llamada a invoke() es similar a que el usuario
haya cliqueado sobre el checkbox. Por ejemplo,
podríamos añadir un botón que sea capaz de
cambiar el estado.
1. self.checkbox_value =
tk.BooleanVar(self)
2. self.checkbox =
ttk.Checkbutton(self,
3. text="Opción",
4.
variable=self.checkbox_value,
5.
command=self.checkbox_clicked)
6. self.checkbox.place(x=40, y=70)
7.
8. self.button = ttk.Button(self,
9. text="Cambiar",
command=self.button_clicked)
10. self.button.place(x=40, y=130)
11. self.place(width=300,
height=200)
12.
13. def checkbox_clicked(self):
14. print(self.checkbox_value.get())
15.
16. def button_clicked(self):
17. self.checkbox.invoke()
La diferencia entre llamar a invoke() y cambiar
el valor manualmente utilizando
self.checkbox_value.set() es que el primer
método simula por completo un cambio de
estado, eso incluye la llamada a la función
checkbox_clicked o cualquier otra registrada
vía el parámetro command , e incluso el control
recibe el foco como se esperaría ante un clic del
usuario.
Una alternativa más
agradable
Conociendo ya los detalles de la clase
Checkbutton , podemos obtener un nuevo
control que se base en ésta pero que otorgue
una implementación más agradable.
En nuestro código anterior, debíamos crear dos
objetos: el control en sí ( self.checkbox ) y una
variable que almacene su estado
( self.checkbox_value ). Para simpli!car esta
operación, nuestra clase introduce tres
funciones:
checked() para determinar el estado del
control ( True o False ).
check() y uncheck() para establecer los
estados.
Solo es necesario crear un objeto. Veamos el
ejemplo:
1. #!/usr/bin/env python
2. # -*- coding: utf-8 -*-
3.
4. import tkinter as tk
5. from tkinter import ttk
6.
7.
8. class Checkbox(ttk.Checkbutton):
9.
10. def __init__(self, *args, **kwargs):
11. super().__init__(*args,
**kwargs)
12. self.variable =
tk.BooleanVar(self)
13.
self.configure(variable=self.variable)
14.
15. def checked(self):
16. return self.variable.get()
17.
18. def check(self):
19. self.variable.set(True)
20.
21. def uncheck(self):
22. self.variable.set(False)
23.
24.
25. class Application(ttk.Frame):
26.
27. def __init__(self, main_window):
28. super().__init__(main_window)
29. main_window.title("Checkbutton
en tkinter")
30.
31. # No es necesario crear una
variable.
32. self.checkbox = Checkbox(self,
33. text="Opción",
command=self.check_clicked)
34. self.checkbox.place(x=40, y=70)
35.
36. self.place(width=300,
height=200)
37.
38. def check_clicked(self):
39. print(self.checkbox.checked())
40.
41.
42. main_window = tk.Tk()
43. app = Application(main_window)
44. app.mainloop()
Como podrás observar, nuestro código se torna
más compacto y legible. Además, incluye los
métodos explicados anteriormente, como
invoke() .
Otras consideraciones
Por conveniencia se suele utilizar una variable
booleana para representar los estados de un
checkbox. Sin embargo, en Tcl/Tk, puede usarse
cualquier otro tipo, como IntVar o StringVar .
Por ejemplo, un control podría almacenar su
estado como cadenas de caracteres, a saber,
"activado" y "desactivado" .
1. self.checkbutton_value =
tk.StringVar(self)
2. self.checkbutton =
ttk.Checkbutton(
3. self,
4. text="Opción",
5.
variable=self.checkbutton_value,
6. onvalue="activado",
7. offvalue="desactivado")
De esta forma, self.checkbutton_value.get()
retornará alguno de los dos valores
especi!cados en los parámetros onvalue y
offvalue .
No es posible determinar qué valor retornará
get() si el usuario aún no ha presionado sobre
el checkbox, pero se tiene la certeza de que será
un valor distinto a onvalue y offvalue . En
nuestro ejemplo, podemos considerar:
1. chosen = self.checkbutton_value.get() in
("activado", "desactivado")
chosen será igual a False cuando aun no se ha
hecho una elección y True en caso contrario.
Artículos relacionados
Bloc de notas simple con Tk (tkinter)
Examinar archivo o carpeta en Tk (tkinter)
Barra de desplazamiento (Scrollbar) en Tk
(tkinter)
Íconos en ventanas de Tk (tkinter)
Lista desplegable (Combobox) en Tcl/Tk
(tkinter)
Curso online
¡Ya lanzamos el curso o!cial de Recursos Python
en Udemy! Un curso moderno para aprender
Python desde cero con programación orientada
a objetos, SQL y tkinter en 2023.
Discord y Twitter
¡Te invitamos a sumarte a nuestro nuevo
servidor de Discord! ¡Y no olvides seguirnos en
Twitter!
Donar
¿Te gusta nuestro contenido? ¡Ayudanos a seguir
creciendo con una donación!
Entrada publicada en Guías y Manuales con las
etiquetas tcl/tk tkinter
Hipervínculo en Tcl/Tk (tkinter)
Inyector de DLL con interfaz grá!ca
Deja una respuesta
Comentario *
Nombre *
Email *
Publicar el comentario
Búsqueda …
Últimas entradas
El módulo «operator» y la programación
funcional
Desplegar un proyecto de Django en
PythonAnywhere
Reproducir inyección SQL en sqlite3 y
PyMySQL
Bloc de notas simple con Tk (tkinter)
Examinar archivo o carpeta en Tk (tkinter)
Comentarios recientes
Recursos Python en Tetris con PyGame
huguitovi en Tetris con PyGame
Ghira en Controlar el navegador –
webbrowser
Recursos Python en Lista desplegable
(Combobox) en Tcl/Tk (tkinter)
Raftxo en No se encontró Python; ejecuta sin
argumentos para instalar desde Microsoft
Store
© 2013 - 2023
¡Suscríbete a nuestra newsletter!
Políticas de Uso y Privacidad
En inglés: Python Assets