Documentos de Académico
Documentos de Profesional
Documentos de Cultura
tkinter 3
Plan de trabajo
Estructuras condicionales
control Checkbutton
control Listbox
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:
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()
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)
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:
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()
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
1. 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.
Control Listbox
El control visual Listbox se emplea para mostrar una lista de items. El usuario puede
seleccionar uno o más elementos de la lista según como se lo configure al crearlo.
Problema:
Disponer un Listbox con una serie de nombres de frutas. Permitir la selección solo de uno
de ellos. Cuando se presione un botón recuperar la fruta seleccionada y mostrarla en una
Label.
Programa:
import tkinter as tk
class Aplicacion:
def __init__(self):
self.ventana1=tk.Tk()
self.listbox1=tk.Listbox(self.ventana1)
self.listbox1.grid(column=0,row=0)
self.listbox1.insert(0,"papa")
self.listbox1.insert(1,"manzana")
self.listbox1.insert(2,"pera")
self.listbox1.insert(3,"sandia")
self.listbox1.insert(4,"naranja")
self.listbox1.insert(5,"melon")
self.boton1=tk.Button(self.ventana1, text="Recuperar",
command=self.recuperar)
self.boton1.grid(column=0, row=1)
self.label1=tk.Label(self.ventana1,text="Seleccionado:")
self.label1.grid(column=0, row=2)
self.ventana1.mainloop()
def recuperar(self):
if len(self.listbox1.curselection())!=0:
self.label1.configure(text=self.listbox1.get(self.listbox1.cursel
ection()[0]))
aplicacion1=Aplicacion()
self.listbox1=tk.Listbox(self.ventana1)
self.listbox1.insert(0,"papa")
self.listbox1.insert(1,"manzana")
self.listbox1.insert(2,"pera")
self.listbox1.insert(3,"sandia")
self.listbox1.insert(4,"naranja")
self.listbox1.insert(5,"melon")
def recuperar(self):
if len(self.listbox1.curselection())!=0:
self.label1.configure(text=self.listbox1.get(self.listbox1.curselection()[0]))
El método curselection retorna una tupla con todas las posiciones seleccionadas del
Listbox. Como se trata de un Listbox que permite la selección de un único item luego por
eso accedemos al item de la tupla de la posición 0.
Problema:
Disponer un Listbox con una serie de nombres de frutas. Permitir la selección de varias
frutas. Cuando se presione un botón recuperar todas las frutas seleccionadas y mostrarlas
en una Label.
Programa:
import tkinter as tk
class Aplicacion:
def __init__(self):
self.ventana1=tk.Tk()
self.listbox1=tk.Listbox(self.ventana1,
selectmode=tk.MULTIPLE)
self.listbox1.grid(column=0,row=0)
self.listbox1.insert(0,"papa")
self.listbox1.insert(1,"manzana")
self.listbox1.insert(2,"pera")
self.listbox1.insert(3,"sandia")
self.listbox1.insert(4,"naranja")
self.listbox1.insert(5,"melon")
self.boton1=tk.Button(self.ventana1, text="Recuperar",
command=self.recuperar)
self.boton1.grid(column=0, row=1)
self.label1=tk.Label(self.ventana1,text="Seleccionado:")
self.label1.grid(column=0, row=2)
self.ventana1.mainloop()
def recuperar(self):
if len(self.listbox1.curselection())!=0:
todas=''
for posicion in self.listbox1.curselection():
todas+=self.listbox1.get(posicion)+"\n"
self.label1.configure(text=todas)
aplicacion1=Aplicacion()
self.listbox1=tk.Listbox(self.ventana1,
selectmode=tk.MULTIPLE)
Para mostrar todas las frutas seleccionadas ahora debemos disponer un for para recorrer la
tupla que retorna el método curselection y concatenarlas:
def recuperar(self):
if len(self.listbox1.curselection())!=0:
todas=''
for posicion in self.listbox1.curselection():
todas+=self.listbox1.get(posicion)+"\n"
self.label1.configure(text=todas)
Barra de scroll
Por defecto no aparece una barra de scroll si la cantidad de item supera el tamaño del
cuadro del Listbox. Para que se muestre una barra de scroll la debemos crear y enlazar con
el Listbox.
Programa:
import tkinter as tk
class Aplicacion:
def __init__(self):
self.ventana1=tk.Tk()
self.scroll1 = tk.Scrollbar(self.ventana1,
orient=tk.VERTICAL)
self.listbox1=tk.Listbox(self.ventana1,
selectmode=tk.MULTIPLE, yscrollcommand=self.scroll1.set)
self.listbox1.grid(column=0,row=0)
self.scroll1.configure(command=self.listbox1.yview)
self.scroll1.grid(column=1, row=0, sticky='NS')
self.listbox1.insert(0,"papa")
self.listbox1.insert(1,"manzana")
self.listbox1.insert(2,"pera")
self.listbox1.insert(3,"sandia")
self.listbox1.insert(4,"naranja")
self.listbox1.insert(5,"melon")
self.listbox1.insert(6,"limon")
self.listbox1.insert(7,"kiwi")
self.listbox1.insert(5,"banana")
self.listbox1.insert(5,"uva")
self.listbox1.insert(5,"papaya")
self.listbox1.insert(5,"mandarina")
self.listbox1.insert(5,"frutilla")
self.boton1=tk.Button(self.ventana1, text="Recuperar",
command=self.recuperar)
self.boton1.grid(column=0, row=1)
self.label1=tk.Label(self.ventana1,text="Seleccionado:")
self.label1.grid(column=0, row=2)
self.ventana1.mainloop()
def recuperar(self):
if len(self.listbox1.curselection())!=0:
todas=''
for posicion in self.listbox1.curselection():
todas+=self.listbox1.get(posicion)+"\n"
self.label1.configure(text=todas)
aplicacion1=Aplicacion()
self.scroll1 = tk.Scrollbar(self.ventana1,
orient=tk.VERTICAL)
Al Scrollbar configuramos el parámetro command con la referencia del método yview del
Listbox:
self.scroll1.configure(command=self.listbox1.yview)
Problema propuesto
1. Solicitar el ingreso del nombre de una persona y seleccionar de un control Listbox un
país. Al presionar un botón mostrar en la barra de la ventana el nombre ingresado y
el país seleccionado.