Esta página contiene las soluciones para los ejercicios del día 12 del curso. Ejercicios dedicados a los eventos con Tkinter.
- 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()
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)
- 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.
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()
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.
- El resultado, sería algo como esto.
#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»