Guida dettagliata per acquisire eventi di mouse e tastiera con Tkinter

Tkinter es un kit de herramientas muy útil para desarrollar aplicaciones GUI en Python. Esta guía describe en detalle cómo obtener eventos del ratón y el teclado utilizando Tkinter. Cubrimos desde la configuración básica hasta ejemplos prácticos y ejercicios, proporcionando conocimientos útiles para el desarrollo real.

Índice

Configuración básica de Tkinter e instalación

Tkinter está integrado en Python, por lo que no requiere instalación adicional. Sin embargo, aquí explicamos cómo verificar la versión de Tkinter y cómo instalarlo en caso de que no esté incluido.

Verificación de la versión de Tkinter

Para verificar si Tkinter está instalado, ejecute el siguiente comando:

import tkinter as tk
print(tk.TkVersion)

Si al ejecutar este comando se muestra una versión, Tkinter está correctamente instalado.

Instalación de Python y Tkinter

Si Tkinter no está instalado, siga estos pasos para instalarlo.

Instalación de Python

Descargue e instale la última versión de Python desde el sitio web oficial. Asegúrese de marcar la opción “Add Python to PATH” durante la instalación.

Instalación de Tkinter

Normalmente, al instalar Python, Tkinter se instala automáticamente. Si no es así, puede instalarlo con el siguiente comando:

sudo apt-get install python3-tk

En Windows, puede intentar reinstalar Python o agregar el directorio de Python a las variables de entorno PATH.

Creación de una aplicación básica con Tkinter

Ejecute el siguiente código para confirmar que la ventana de Tkinter se muestra correctamente:

import tkinter as tk

root = tk.Tk()
root.title("Configuración básica de Tkinter")
root.geometry("300x200")

label = tk.Label(root, text="¡Hola, Tkinter!")
label.pack(pady=20)

root.mainloop()

Este código crea una ventana básica de Tkinter que muestra el mensaje “¡Hola, Tkinter!”. Con esto, hemos completado la configuración básica y la instalación de Tkinter.

Obtención de eventos del ratón

A continuación, explicamos cómo obtener eventos del ratón utilizando Tkinter, incluidos los eventos de clic, movimiento y arrastre.

Obtención de eventos de clic del ratón

Para obtener eventos de clic del ratón, se deben vincular eventos a los widgets. En el siguiente ejemplo, capturamos el evento de clic izquierdo y mostramos las coordenadas donde ocurrió el clic.

import tkinter as tk

def on_left_click(event):
    print("Se hizo clic con el botón izquierdo en", event.x, event.y)

root = tk.Tk()
root.title("Evento de clic del ratón")

frame = tk.Frame(root, width=300, height=200)
frame.bind("<Button-1>", on_left_click)
frame.pack()

root.mainloop()

Obtención de eventos de movimiento del ratón

Para capturar los eventos de movimiento del ratón, utilizamos el evento de movimiento. En el siguiente ejemplo, mostramos en tiempo real la posición actual del ratón.

import tkinter as tk

def on_mouse_move(event):
    label.config(text=f"Posición del ratón: {event.x}, {event.y}")

root = tk.Tk()
root.title("Evento de movimiento del ratón")

label = tk.Label(root, text="Mueve el ratón dentro del marco")
label.pack(pady=10)

frame = tk.Frame(root, width=300, height=200, bg="lightgrey")
frame.bind("<Motion>", on_mouse_move)
frame.pack()

root.mainloop()

Obtención de eventos de arrastre del ratón

Para capturar eventos de arrastre del ratón, utilizamos eventos como el siguiente. En este ejemplo, cuando arrastramos el ratón con el botón izquierdo presionado, mostramos la posición en la que se encuentra el ratón mientras se arrastra.

import tkinter as tk

def on_drag(event):
    label.config(text=f"Arrastrando en {event.x}, {event.y}")

root = tk.Tk()
root.title("Evento de arrastre del ratón")

label = tk.Label(root, text="Arrastra el ratón dentro del marco")
label.pack(pady=10)

frame = tk.Frame(root, width=300, height=200, bg="lightgrey")
frame.bind("<B1-Motion>", on_drag)
frame.pack()

root.mainloop()

Resumen de eventos del ratón

Combinando estos eventos, se pueden lograr interacciones avanzadas con el ratón en Tkinter. Configurando correctamente los controladores de eventos y implementando el procesamiento adecuado para cada evento, se puede mejorar la usabilidad de la interfaz de usuario.

Obtención de eventos del teclado

A continuación, detallamos cómo obtener eventos del teclado utilizando Tkinter, incluyendo eventos de presionar y soltar teclas.

Obtención de eventos de presionar una tecla

Para capturar eventos de presionar una tecla, usamos el evento correspondiente. En el siguiente ejemplo, mostramos la tecla presionada en tiempo real.

import tkinter as tk

def on_key_press(event):
    label.config(text=f"Tecla presionada: {event.keysym}")

root = tk.Tk()
root.title("Evento de presionar tecla")

label = tk.Label(root, text="Presiona cualquier tecla")
label.pack(pady=20)

root.bind("<KeyPress>", on_key_press)

root.mainloop()

Obtención de eventos de liberar una tecla

Para capturar eventos de liberación de una tecla, usamos el evento correspondiente. En este ejemplo, mostramos la tecla liberada.

import tkinter as tk

def on_key_release(event):
    label.config(text=f"Tecla liberada: {event.keysym}")

root = tk.Tk()
root.title("Evento de liberar tecla")

label = tk.Label(root, text="Presiona y suelta cualquier tecla")
label.pack(pady=20)

root.bind("<KeyRelease>", on_key_release)

root.mainloop()

Obtención de eventos de teclas específicas

Para obtener eventos de teclas específicas, se especifica el símbolo de la tecla al vincular el evento. En el siguiente ejemplo, mostramos un mensaje cuando se presiona la tecla espacio.

import tkinter as tk

def on_space_press(event):
    label.config(text="Tecla espacio presionada")

root = tk.Tk()
root.title("Evento de tecla específica")

label = tk.Label(root, text="Presiona la tecla espacio")
label.pack(pady=20)

root.bind("<space>", on_space_press)

root.mainloop()

Procesando múltiples eventos de teclas

Para procesar múltiples eventos de teclas simultáneamente, se configuran múltiples vínculos de eventos. En este ejemplo, procesamos las teclas de flecha izquierda y derecha.

import tkinter as tk

def on_left_key(event):
    label.config(text="Tecla flecha izquierda presionada")

def on_right_key(event):
    label.config(text="Tecla flecha derecha presionada")

root = tk.Tk()
root.title("Múltiples eventos de tecla")

label = tk.Label(root, text="Presiona las teclas flecha izquierda o derecha")
label.pack(pady=20)

root.bind("<Left>", on_left_key)
root.bind("<Right>", on_right_key)

root.mainloop()

Resumen de eventos del teclado

Utilizando estos eventos del teclado, se pueden crear aplicaciones interactivas que reaccionen inmediatamente a la entrada del usuario. Configurando correctamente los controladores de eventos, se mejora la usabilidad de la interfaz.

Configuración de controladores de eventos

Para manejar eventos del ratón o el teclado en Tkinter, es necesario configurar controladores de eventos. Aquí explicamos cómo configurar controladores de eventos y ejemplos de su uso.

¿Qué son los controladores de eventos?

Los controladores de eventos son funciones que se llaman cuando ocurre un evento específico. Al configurar controladores de eventos, se pueden añadir comportamientos a las acciones del usuario.

Vinculación básica de eventos

Para configurar un controlador de eventos, se vincula un evento a un widget. Al vincular, se especifica el nombre del evento y la función del controlador.

import tkinter as tk

def on_event(event):
    print("Evento activado:", event)

root = tk.Tk()
root.title("Ejemplo de vinculación de eventos")

button = tk.Button(root, text="Haz clic en mí")
button.bind("<Button-1>", on_event)
button.pack(pady=20)

root.mainloop()

En este ejemplo, cuando se hace clic en el botón, se llama a la función on_event y se muestra la información del evento.

Vinculación de múltiples eventos a un controlador

También es posible vincular múltiples eventos a un solo widget. En este ejemplo, vinculamos eventos de clic y de teclado a un botón.

import tkinter as tk

def on_click(event):
    print("Botón clickeado")

def on_key(event):
    print("Tecla presionada:", event.keysym)

root = tk.Tk()
root.title("Vinculación de múltiples eventos")

button = tk.Button(root, text="Haz clic o presiona una tecla")
button.bind("<Button-1>", on_click)
button.bind("<Key>", on_key)
button.pack(pady=20)

button.focus_set()  # Establece el foco para obtener eventos de teclado

root.mainloop()

En este ejemplo, se llaman diferentes controladores según si se hace clic en el botón o si se presiona una tecla.

Desvinculación de controladores de eventos

Si es necesario, también se pueden desvincular los controladores de eventos. A continuación, mostramos cómo desvincular un evento.

import tkinter as tk

def on_click(event):
    print("Botón clickeado")

root = tk.Tk()
root.title("Ejemplo de desvinculación de evento")

button = tk.Button(root, text="Haz clic en mí")
button.bind("<Button-1>", on_click)
button.pack(pady=20)

# Desvincula el evento
button.unbind("<Button-1>")

root.mainloop()

Ejemplos avanzados de controladores de eventos

Los controladores de eventos permiten realizar interacciones complejas. A continuación, se muestran algunos ejemplos avanzados.

Arrastrar y soltar

Un ejemplo de implementación de la operación de arrastrar y soltar. Se puede mover un elemento arrastrándolo.

import tkinter as tk

def start_drag(event):
    widget = event.widget
    widget._drag_data = {"x": event.x, "y": event.y}

def do_drag(event):
    widget = event.widget
    x = widget.winfo_x() + event.x - widget._drag_data["x"]
    y = widget.winfo_y() + event.y - widget._drag_data["y"]
    widget.place(x=x, y=y)

root = tk.Tk()
root.title("Ejemplo de arrastrar y soltar")

label = tk.Label(root, text="Arrástrame", bg="lightblue", width=10, height=2)
label.place(x=50, y=50)
label.bind("<Button-1>", start_drag)
label.bind("<B1-Motion>", do_drag)

root.mainloop()

Creación de eventos personalizados

Un ejemplo de cómo crear eventos personalizados y asignar controladores a esos eventos. Se puede generar un evento definido por el usuario.

import tkinter as tk

def custom_event_handler(event):
    print("Evento personalizado activado")

root = tk.Tk()
root.title("Ejemplo de evento personalizado")

root.bind("<<CustomEvent>>", custom_event_handler)

# Dispara el evento personalizado
root.event_generate("<<CustomEvent>>")

root.mainloop()

Resumen de controladores de eventos

El uso eficaz de los controladores de eventos puede mejorar significativamente la interactividad de las aplicaciones en Tkinter. Al configurar correctamente la vinculación de eventos, el manejo de múltiples eventos y la desvinculación de eventos, se mejora la experiencia del usuario.

Ejemplos avanzados de eventos del ratón

El uso de eventos del ratón puede mejorar la operatividad de la interfaz de usuario. A continuación, mostramos algunos ejemplos prácticos de aplicación de estos eventos.

Implementación de funcionalidad de arrastrar y soltar

Usando eventos del ratón, se implementa la funcionalidad de mover un widget mediante arrastrar y soltar. El siguiente código permite mover una etiqueta arrastrándola.

import tkinter as tk

def start_drag(event):
    widget = event.widget
    widget._drag_data = {"x": event.x, "y": event.y}

def do_drag(event):
    widget = event.widget
    x = widget.winfo_x() + event.x - widget._drag_data["x"]
    y = widget.winfo_y() + event.y - widget._drag_data["y"]
    widget.place(x=x, y=y)

root = tk.Tk()
root.title("Ejemplo de arrastrar y soltar")

label = tk.Label(root, text="Arrástrame", bg="lightblue", width=10, height=2)
label.place(x=50, y=50)
label.bind("<Button-1>", start_drag)
label.bind("<B1-Motion>", do_drag)

root.mainloop()

Implementación de menú con clic derecho

Configuramos un controlador de eventos para mostrar un menú de clic derecho (menú contextual). En el siguiente ejemplo, al hacer clic derecho se muestra un menú con varias opciones.

import tkinter as tk
from tkinter import Menu

def show_context_menu(event):
    context_menu.post(event.x_root, event.y_root)

root = tk.Tk()
root.title("Ejemplo de menú con clic derecho")

context_menu = Menu(root, tearoff=0)
context_menu.add_command(label="Opción 1")
context_menu.add_command(label="Opción 2")
context_menu.add_command(label="Opción 3")

frame = tk.Frame(root, width=300, height=200, bg="lightgrey")
frame.bind("<Button-3>", show_context_menu)
frame.pack()

root.mainloop()

Implementación de una aplicación de dibujo

Usando eventos del ratón, creamos una simple aplicación de dibujo. En el siguiente código, se dibujan líneas al arrastrar el ratón.

import tkinter as tk

def start_draw(event):
    global last_x, last_y
    last_x, last_y = event.x, event.y

def draw(event):
    global last_x, last_y
    canvas.create_line((last_x, last_y, event.x, event.y), width=2)
    last_x, last_y = event.x, event.y

root = tk.Tk()
root.title("Aplicación de dibujo")

last_x, last_y = None, None

canvas = tk.Canvas(root, bg="white", width=400, height=300)
canvas.pack()

canvas.bind("<Button-1>", start_draw)
canvas.bind("<B1-Motion>", draw)

root.mainloop()

Implementación de una función de zoom

Usamos eventos de la rueda del ratón para implementar una función de zoom para un widget. En el siguiente ejemplo, cambiamos la escala de un lienzo.

import tkinter as tk

def zoom(event):
    scale = 1.0
    if event.delta > 0:
        scale *= 1.1
    else:
        scale /= 1.1
    canvas.scale("all", event.x, event.y, scale, scale)

root = tk.Tk()
root.title("Ejemplo de zoom")

canvas = tk.Canvas(root, bg="white", width=400, height=300)
canvas.pack(fill=tk.BOTH, expand=True)

canvas.bind("<MouseWheel>", zoom)

# Dibuja figuras iniciales
canvas.create_rectangle(50, 50, 150, 150, fill="blue")
canvas.create_oval(200, 50, 300, 150, fill="red")

root.mainloop()

Resumen de aplicaciones de eventos del ratón

Usando eventos del ratón, se pueden implementar funcionalidades como arrastrar y soltar, mostrar menús contextuales, crear aplicaciones de dibujo y zoom. Aplicando estas técnicas, podemos crear interfaces atractivas y fáciles de usar.

Ejemplos avanzados de eventos del teclado

Los eventos del teclado mejoran la operatividad de la interfaz de usuario. A continuación, mostramos algunos ejemplos prácticos de aplicación.

Implementación de teclas de acceso rápido

Configurar teclas de acceso rápido permite que los usuarios accedan rápidamente a las funciones de la aplicación. En el siguiente ejemplo, se muestra un mensaje al presionar Ctrl+S.

import tkinter as tk

def save(event):
    label.config(text="Atajo activado (Ctrl+S)")

root = tk.Tk()
root.title("Ejemplo de tecla de acceso rápido")

label = tk.Label(root, text="Presiona Ctrl+S para activar el atajo")
label.pack(pady=20)

root.bind("<Control-s>", save)

root.mainloop()

Personalización de campos de entrada de texto

Vinculamos eventos de teclado a un campo de entrada de texto para implementar comportamientos personalizados. En el siguiente ejemplo, al presionar la tecla Enter, mostramos el contenido del campo de texto en una etiqueta.

import tkinter as tk

def on_enter(event):
    label.config(text=f"Texto ingresado: {entry.get()}")

root = tk.Tk()
root.title("Ejemplo de entrada de texto")

entry = tk.Entry(root)
entry.pack(pady=10)
entry.bind("<Return>", on_enter)

label = tk.Label(root, text="Presiona Enter después de escribir")
label.pack(pady=10)

root.mainloop()

Implementación de un controlador de juego

Usamos eventos del teclado para implementar un controlador de juego simple. En este ejemplo, movemos un rectángulo usando las teclas de flecha.

import tkinter as tk

def move_left(event):
    canvas.move(rect, -10, 0)

def move_right(event):
    canvas.move(rect, 10, 0)

def move_up(event):
    canvas.move(rect, 0, -10)

def move_down(event):
    canvas.move(rect, 0, 10)

root = tk.Tk()
root.title("Ejemplo de controlador de juego")

canvas = tk.Canvas(root, width=400, height=400, bg="white")
canvas.pack()

rect = canvas.create_rectangle(180, 180, 220, 220, fill="blue")

root.bind("<Left>", move_left)
root.bind("<Right>", move_right)
root.bind("<Up>", move_up)
root.bind("<Down>", move_down)

root.mainloop()

Operación de formularios

Personalizamos la operación de formularios utilizando la tecla Tab para mover entre los campos de entrada. En este ejemplo, Shift+Tab mueve al campo anterior.

import tkinter as tk

def focus_next_widget(event):
    event.widget.tk_focusNext().focus()
    return "break"

def focus_prev_widget(event):
    event.widget.tk_focusPrev().focus()
    return "break"

root = tk.Tk()
root.title("Ejemplo de navegación de formulario")

entry1 = tk.Entry(root)
entry2 = tk.Entry(root)
entry3 = tk.Entry(root)

entry1.pack(pady=5)
entry2.pack(pady=5)
entry3.pack(pady=5)

entry1.bind("<Tab>", focus_next_widget)
entry2.bind("<Tab>", focus_next_widget)
entry3.bind("<Tab>", focus_next_widget)

entry1.bind("<Shift-Tab>", focus_prev_widget)
entry2.bind("<Shift-Tab>", focus_prev_widget)
entry3.bind("<Shift-Tab>", focus_prev_widget)

root.mainloop()

Resumen de aplicaciones de eventos del teclado

Los eventos del teclado permiten implementar atajos de teclado, personalizar campos de entrada de texto, controlar juegos, operar formularios y mucho más. Estas aplicaciones mejoran la experiencia del usuario y permiten una interfaz más eficiente e intuitiva.

Resumen de problemas de práctica y respuestas

En esta sección, revisamos algunos ejercicios y sus respuestas para ayudar a comprender cómo aplicar lo aprendido en la práctica. Estos ejercicios ayudan a afianzar el conocimiento sobre los eventos del ratón y del teclado.

Ejercicio 1: Cambiar color con clic del ratón

Pregunta: Cree un programa que cambie el color de fondo de la etiqueta a un color aleatorio cuando se haga clic en el botón.

Pista: Use el módulo random para generar colores aleatorios.

Respuesta:

import tkinter as tk
import random

def change_color(event):
    colors = ["red", "green", "blue", "yellow", "purple", "orange"]
    color = random.choice(colors)
    label.config(bg=color)

root = tk.Tk()
root.title("Cambio de color con clic")

label = tk.Label(root, text="Haz clic en el botón para cambiar mi color", width=40, height=10)
label.pack(pady=20)

button = tk.Button(root, text="Cambiar color")
button.bind("<Button-1>", change_color)
button.pack()

root.mainloop()

Ejercicio 2: Contar caracteres con entrada de texto

Pregunta: Cree un programa que cuente el número de caracteres escritos en un campo de entrada de texto en tiempo real y lo muestre.

Pista: Utilice el evento <KeyRelease>.

Respuesta:

import tkinter as tk

def update_count(event):
    count = len(entry.get())
    label.config(text=f"Número de caracteres: {count}")

root = tk.Tk()
root.title("Contador de caracteres")

entry = tk.Entry(root)
entry.pack(pady=10)
entry.bind("<KeyRelease>", update_count)

label = tk.Label(root, text="Número de caracteres: 0")
label.pack(pady=10)

root.mainloop()

Ejercicio 3: Dibujar círculos con el ratón

Pregunta: Cree un programa que dibuje círculos en un lienzo al arrastrar el ratón. Al presionar el botón izquierdo del ratón y arrastrarlo, se debe dibujar un círculo.

Pista: Use el método create_oval.

Respuesta:

import tkinter as tk

def draw_circle(event):
    x, y = event.x, event.y
    r = 10  # Radio
    canvas.create_oval(x-r, y-r, x+r, y+r, fill="blue")

root = tk.Tk()
root.title("Dibujar círculos")

canvas = tk.Canvas(root, bg="white", width=400, height=300)
canvas.pack()
canvas.bind("<B1-Motion>", draw_circle)

root.mainloop()

Ejercicio 4: Actualizar etiqueta con atajo de teclado

Pregunta: Cree un programa que actualice el texto de una etiqueta cuando se presiona Ctrl+U.

Pista: Utilice el evento <Control-u>.

Respuesta:

import tkinter as tk

def update_label(event):
    label.config(text="¡Atajo activado!")

root = tk.Tk()
root.title("Actualización con atajo de teclado")

label = tk.Label(root, text="Presiona Ctrl+U para actualizar este texto")
label.pack(pady=20)

root.bind("<Control-u>", update_label)

root.mainloop()

Resumen de ejercicios de práctica

Estos ejercicios permiten repasar la obtención de eventos de ratón y teclado en Tkinter, ayudando a aplicar los conceptos adquiridos en situaciones prácticas. Utilícelos como base para implementar sus propias aplicaciones interactivas.

Preguntas frecuentes y solución de problemas

En esta sección se abordan preguntas comunes y sus soluciones para facilitar el desarrollo con Tkinter.

Pregunta 1: La ventana de Tkinter no aparece

Problema: La ventana de Tkinter no aparece al ejecutar el programa.

Solución: La causa más común es que root.mainloop() no se ha llamado. Este método inicia el bucle de eventos de la aplicación y mantiene la ventana visible. Asegúrese de llamar a este método al final del programa:

import tkinter as tk

root = tk.Tk()
root.title("Ventana de ejemplo")
root.geometry("300x200")

root.mainloop()  # Asegúrese de llamar a este método

Pregunta 2: Los eventos del teclado no responden

Problema: Los eventos del teclado no responden aunque se hayan configurado.

Solución: Para obtener eventos del teclado, es necesario que el widget tenga el foco. Use el método focus_set para asegurarse de que el widget esté enfocado:

import tkinter as tk

def on_key_press(event):
    print("Tecla presionada:", event.keysym)

root = tk.Tk()
root.title("Ejemplo de evento de teclado")

entry = tk.Entry(root)
entry.pack()
entry.bind("<KeyPress>", on_key_press)
entry.focus_set()  # Establece el foco para recibir eventos de teclado

root.mainloop()

Pregunta 3: Los eventos del ratón no funcionan correctamente

Problema: Los eventos del ratón no funcionan aunque se hayan vinculado correctamente.

Solución: Asegúrese de que los eventos estén vinculados a los widgets después de que se hayan creado y colocado en la ventana. También verifique si los widgets son visibles y están configurados correctamente.

import tkinter as tk

def on_click(event):
    print("Clic en el ratón en", event.x, event.y)

root = tk.Tk()
root.title("Ejemplo de evento del ratón")

frame = tk.Frame(root, width=300, height=200, bg="lightgrey")
frame.pack()
frame.bind("<Button-1>", on_click)  # Vincule después de agregar el widget

root.mainloop()

Pregunta 4: Las figuras en el lienzo no se muestran correctamente

Problema: Las figuras no se dibujan correctamente en el lienzo.

Solución: Asegúrese de que las coordenadas y tamaños de las figuras sean correctos y que el lienzo esté configurado para mostrarlas.

import tkinter as tk

root = tk.Tk()
root.title("Ejemplo de dibujo en lienzo")

canvas = tk.Canvas(root, bg="white", width=400, height=300)
canvas.pack()

# Asegúrese de que las coordenadas sean correctas
canvas.create_rectangle(50, 50, 150, 150, fill="blue")
canvas.create_oval(200, 50, 300, 150, fill="red")

root.mainloop()

Pregunta 5: La aplicación de Tkinter se cierra inesperadamente

Problema: La aplicación se cierra inesperadamente mientras se ejecuta.

Solución: Este problema puede ocurrir debido a un manejo inadecuado de excepciones o un uso incorrecto de subprocesos. Asegúrese de manejar las excepciones adecuadamente y de que las operaciones relacionadas con la GUI se realicen en el hilo principal.

import tkinter as tk

def update_label():
    try:
        label.config(text="Texto actualizado")
    except Exception as e:
        print("Error:", e)

root = tk.Tk()
root.title("Manejo de excepciones")

label = tk.Label(root, text="Texto inicial")
label.pack()

button = tk.Button(root, text="Actualizar texto", command=update_label)
button.pack()

root.mainloop()

Conclusión

En este artículo, hemos cubierto cómo manejar eventos del ratón y del teclado en Tkinter. Desde la configuración básica hasta la creación de aplicaciones interactivas, hemos explicado cómo aprovechar estos eventos para mejorar la experiencia del usuario en aplicaciones GUI.

Al dominar estos conceptos, podrá desarrollar aplicaciones más interactivas y dinámicas. A medida que adquiera experiencia, podrá aplicar estos conocimientos para crear interfaces aún más sofisticadas con Tkinter y otros módulos de Python.

Índice