Soluciones de ejercicios con eventos de Tkinter – 100 días de Python #12

Soluciones de ejercicios con eventos de Tkinter – 100 días de Python #12

Esta página contiene las soluciones para los ejercicios del día 12 del curso. Ejercicios dedicados a los eventos con Tkinter.

  1. La solución con pack():
#Importaciones
from tkinter import *

#Creación de la ventana principal
root = Tk()
#Título de la ventana
root.title("Curso de Tkinter de Programación Fácil")

#Botones
Button(root, text="Botón 1").pack()
Button(root, text="Botón 2").pack()
Button(root, text="Botón 3").pack()
Button(root, text="Botón 4").pack()

#Bucle de ejecución
root.mainloop()
ejercicios eventos tkinter

La solución con grid():

#Botones
Button(root, text="Botón 1").grid(row=0, column=0)
Button(root, text="Botón 2").grid(row=1, column=0)
Button(root, text="Botón 3").grid(row=2, column=0)
Button(root, text="Botón 4").grid(row=3, column=0)
  1. Una posible solución sería utilizar una función para no repetir código. Si lo has hecho escribiendo manualmente las etiquetas y te funciona, perfecto.

La función lo que hace es pasar por parámetro un valor que es dado en la llamada. Mira como cada llamada en los command, lleva el número correspondiente a cada botón.

#Importaciones
from tkinter import *

#Creación de la ventana principal
root = Tk()
#Título de la ventana
root.title("Curso de Tkinter de Programación Fácil")

# Evento para el botón
def crear_etiqueta(numero_boton):
    Label(root, text=f"Botón {numero_boton} pulsado.").pack()

# Botones
boton_1 = Button(root, text="Botón 1", command=crear_etiqueta(1)).pack()
boton_2 = Button(root, text="Botón 2", command=crear_etiqueta(2)).pack()
boton_3 = Button(root, text="Botón 3", command=crear_etiqueta(3)).pack()
boton_4 = Button(root, text="Botón 4", command=crear_etiqueta(4)).pack()

#Bucle de ejecución
root.mainloop()

El problema ahora, es que al poner la llamada en el command, se realiza automáticamente sin pulsar ningún botón, tal y como has visto en la teórica.

ejercicios con tkinter

Recuerda que en estos casos de autollamada, tenías que poner una lambda para llamar a la función. Los botones, por defecto son "clickeables" en el sistema operativo con el click izquierdo. En este caso, no haría falta crear un evento con bind().

# Evento para el botón
def crear_etiqueta(numero_boton):
    etiqueta = Label(root, text=f"Botón {numero_boton} pulsado.")
    etiqueta.pack()

# Botones
boton_1 = Button(root, text="Botón 1", command=lambda:crear_etiqueta(1)).pack()
boton_2 = Button(root, text="Botón 2", command=lambda:crear_etiqueta(2)).pack()
boton_3 = Button(root, text="Botón 3", command=lambda:crear_etiqueta(3)).pack()
boton_4 = Button(root, text="Botón 4", command=lambda:crear_etiqueta(4)).pack()
Botones tkinter

Pulsemos el que pulsemos, nos muestra un Label personalizado para cada botón.

De todas formas, si no acabas de entender bien el funcionamiento de las funciones lambda, quédate con este concepto hasta que las consigas dominar:

Cuando tengas que llamar a una función desde un command, utiliza la llamada normal para que se haga efectiva al cargar el programa y usa la llamada con una lambda cuando necesites que se llame cuando tú quieras.

  1. El resultado, sería algo como esto.
Formulario tkinter
#Importaciones
from tkinter import *

#Creación de la ventana principal
root = Tk()
#Título de la ventana
root.title("Curso de Tkinter de Programación Fácil")

#Entrada de datos
#Nombre
Label(root, text="Nombre: ").grid(column=0, row=0)
entrada_nombre = Entry(root)
entrada_nombre.grid(column=1, row=0)

#Edad
Label(root, text="Edad: ").grid(column=0, row=1)
entrada_edad = Entry(root)
entrada_edad.grid(column=1, row=1)

#Evento para el botón
def pulsar_boton():
    #Se obtienen los valores de los Entry
    nombre = entrada_nombre.get()
    edad = entrada_edad.get()
    #Se muestra en una etiqueta el valor del Entry
    Label(root, text=f"Mi nombre es {nombre}. Tengo {edad} años.").grid(column=1, row=3)

#Botón
Button(root, text="Enviar", command=pulsar_boton).grid(column=1, row=2)

#Bucle de ejecución
root.mainloop()

La dificultad real en este ejercicio, estaba más bien en saber colocar los elementos en el grid().

Un comentario en «Soluciones de ejercicios con eventos de Tkinter – 100 días de Python #12»

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

curso de Python Entrada anterior Ejercicios de Programación de eventos con Tkinter – 100 días de Python #12
curso de Python Entrada siguiente Uso avanzado de strings en Python