61 - tkinter : control Checkbutton

El control visual Checkbutton permite implementar un botón de dos estados, más conocido como un cuadro de selección.

Problema:

Mostrar una ventana y en su interior tres controles de tipo Checkbutton cuyas etiquetas correspondan a distintos lenguajes de programación. Cuando se presione un botón mostrar en una Label la cantidad de Checkbutton que se encuentran chequeados.

Programa: ejercicio227.py

Ver video

import tkinter as tk

class Aplicacion:
    def __init__(self):
        self.ventana1=tk.Tk()
        self.seleccion1=tk.IntVar()
        self.check1=tk.Checkbutton(self.ventana1,text="Python", variable=self.seleccion1)
        self.check1.grid(column=0, row=0)
        self.seleccion2=tk.IntVar()
        self.check2=tk.Checkbutton(self.ventana1,text="C++", variable=self.seleccion2)
        self.check2.grid(column=0, row=1)
        self.seleccion3=tk.IntVar()
        self.check3=tk.Checkbutton(self.ventana1,text="Java", variable=self.seleccion3)
        self.check3.grid(column=0, row=2)
        self.boton1=tk.Button(self.ventana1, text="Verificar", command=self.verificar)
        self.boton1.grid(column=0, row=4)
        self.label1=tk.Label(self.ventana1,text="cantidad:")
        self.label1.grid(column=0, row=5)
        self.ventana1.mainloop()

    def verificar(self):
        cant=0
        if self.seleccion1.get()==1:
            cant+=1
        if self.seleccion2.get()==1:
            cant+=1
        if self.seleccion3.get()==1:
            cant+=1
        self.label1.configure(text="cantidad:"+str(cant))


aplicacion1=Aplicacion()

La ejecución de esta aplicación muestra una interfaz visual similar a esta:

tkinter Checkbutton

A cada control de tipo Checkbutton lo asociamos con un objeto de la clase IntVar (por defecto el objeto de la clase IntVar almacena un cero indicando que el Checkbutton debe aparecer no seleccionado):

        self.seleccion1=tk.IntVar()
        self.check1=tk.Checkbutton(self.ventana1,text="Python", variable=self.seleccion1)
        self.check1.grid(column=0, row=0)

Cuando se presiona el botón se ejecuta el método 'verificar' donde analizamos que almacenan los objetos seleccion1, seleccion2 y seleccion3. En el caso de almacenar un 1 significa que el Checkbutton asociado está seleccionado:

    def verificar(self):
        cant=0
        if self.seleccion1.get()==1:
            cant+=1
        if self.seleccion2.get()==1:
            cant+=1
        if self.seleccion3.get()==1:
            cant+=1
        self.label1.configure(text="cantidad:"+str(cant))

Problema:

Disponer un control Checkbutton que muestre el siguiente mensaje: ¿Está de acuerdo con los términos y condiciones?, además agregar un Button desactivo. Cuando se tilde el Checkbutton inmediatamente activar el botón.

Programa: ejercicio228.py

Ver video

import tkinter as tk

class Aplicacion:
    def __init__(self):
        self.ventana1=tk.Tk()
        self.seleccion=tk.IntVar()
        self.check1=tk.Checkbutton(self.ventana1,text="¿Está de acuerdo con los términos y condiciones?", variable=self.seleccion, command=self.cambiarestado)
        self.check1.grid(column=0, row=0)
        self.boton1=tk.Button(self.ventana1, text="Entrar", state="disabled", command=self.ingresar)
        self.boton1.grid(column=0, row=1)        
        self.ventana1.mainloop()

    def cambiarestado(self):
        if self.seleccion.get()==1:
            self.boton1.configure(state="normal")
        if self.seleccion.get()==0:
            self.boton1.configure(state="disabled")

    def ingresar(self):
        self.ventana1.title("Ingresando...")

aplicacion1=Aplicacion()         

La ejecución de esta aplicación muestra una interfaz visual similar a esta:

tkinter Checkbutton

Inmediatamente se inicia la aplicación el botón aparece desactivo (es decir el operador no lo puede presionar) debido a que hemos inicializado el parámetro state con el valor "disabled":

        self.boton1=tk.Button(self.ventana1, text="Entrar", state="disabled", command=self.ingresar)

Otro concepto importante de este ejemplo es que podemos asociar un evento a un control de tipo Checkbutton mediante el parámetro "command" (el mismo se ejecuta cada vez que hacemos un cambio en el control):

        self.check1=tk.Checkbutton(self.ventana1,text="¿Está de acuerdo con los términos y condiciones?", variable=self.seleccion, command=self.cambiarestado)

El método "cambiarestado" tiene por objetivo activar o desactivar el botón según el estado del Checkbutton:

    def cambiarestado(self):
        if self.seleccion.get()==1:
            self.boton1.configure(state="normal")
        if self.seleccion.get()==0:
            self.boton1.configure(state="disabled")

Problema propuesto

  • Disponer varios objetos de la clase Checkbutton con nombres de navegadores web. En el título de la ventana mostrar todos los nombres de navegadores seleccionados.

    Ver video

Solución

ejercicio229.py

import tkinter as tk

class Aplicacion:
    def __init__(self):
        self.ventana1=tk.Tk()
        self.seleccion1=tk.IntVar()
        self.check1=tk.Checkbutton(self.ventana1,text="Chrome", variable=self.seleccion1, command=self.cambiartitulo)
        self.check1.grid(column=0, row=0)
        self.seleccion2=tk.IntVar()
        self.check2=tk.Checkbutton(self.ventana1,text="FireFox", variable=self.seleccion2, command=self.cambiartitulo)
        self.check2.grid(column=1, row=0)
        self.seleccion3=tk.IntVar()
        self.check3=tk.Checkbutton(self.ventana1,text="Edge", variable=self.seleccion3, command=self.cambiartitulo)
        self.check3.grid(column=2, row=0)
        self.seleccion4=tk.IntVar()
        self.check4=tk.Checkbutton(self.ventana1,text="Opera", variable=self.seleccion4, command=self.cambiartitulo)
        self.check4.grid(column=3, row=0)
        self.ventana1.mainloop()

    def cambiartitulo(self):
        cadena='';
        if self.seleccion1.get()==1:
            cadena+="Chrome - "
        if self.seleccion2.get()==1:
            cadena+="Firefox - "
        if self.seleccion3.get()==1:
            cadena+="Edge - "
        if self.seleccion4.get()==1:
            cadena+="Opera"
        self.ventana1.title(cadena)

aplicacion1=Aplicacion()