Programación concurrente con Tkinter: Creación de aplicaciones multitarea
Introducción
Tkinter es una biblioteca de interfaz gráfica de usuario (GUI) para Python. Es una biblioteca de alto nivel que facilita la creación de aplicaciones GUI simples y complejas. Sin embargo, Tkinter no es una biblioteca multitarea. Esto significa que solo puede ejecutar una tarea a la vez.
En algunos casos, es necesario que una aplicación Tkinter pueda ejecutar varias tareas al mismo tiempo. Por ejemplo, una aplicación que descarga un archivo y muestra una barra de progreso debe poder realizar ambas tareas al mismo tiempo.
En este tutorial, aprenderás cómo crear aplicaciones multitarea con Tkinter.
Creación de un hilo
Para crear un hilo en Tkinter, puedes usar la función threading.Thread()
. Esta función toma un objeto de función como argumento.
import threading
def my_function():
# Realiza una tarea
thread = threading.Thread(target=my_function)
thread.start()
En este ejemplo, definimos una función llamada my_function()
que realiza una tarea. Luego, usamos la función threading.Thread()
para crear un hilo que llama a my_function()
.
Comunicación entre hilos
Para que los hilos puedan comunicarse entre sí, pueden usar objetos de bloqueo. Un objeto de bloqueo es un objeto que puede estar en uno de dos estados: bloqueado o desbloqueado.
Para bloquear un hilo, puedes usar el método acquire()
del objeto de bloqueo. Para desbloquear un hilo, puedes usar el método release()
.
import threading
def my_function():
# Realiza una tarea
with lock:
# Accede a un recurso compartido
lock = threading.Lock()
thread1 = threading.Thread(target=my_function)
thread2 = threading.Thread(target=my_function)
thread1.start()
thread2.start()
En este ejemplo, usamos un objeto de bloqueo para garantizar que solo un hilo pueda acceder a un recurso compartido a la vez.
Ejemplo: Descarga de un archivo
En este ejemplo, crearemos una aplicación que descarga un archivo y muestra una barra de progreso.
import threading
import urllib
def download_file(url, filename):
"""Descarga un archivo de una URL.
Args:
url: La URL del archivo.
filename: El nombre del archivo para guardar.
"""
with open(filename, 'wb') as f:
response = urllib.request.urlopen(url)
for chunk in response.readiter():
f.write(chunk)
def update_progress(progress):
"""Actualiza la barra de progreso.
Args:
progress: El progreso de la descarga.
"""
root.update()
bar['value'] = progress
root = tkinter.Tk()
bar = tkinter.ttk.Progressbar(root, orient='horizontal', length=200)
bar.pack()
url = 'https://www.example.com/file.zip'
filename = 'file.zip'
thread = threading.Thread(target=download_file, args=(url, filename))
thread.start()
while thread.is_alive():
update_progress(thread.progress)
root.mainloop()
En este ejemplo, creamos una función llamada download_file()
que descarga un archivo de una URL. Luego, creamos una función llamada update_progress()
que actualiza la barra de progreso.
En el bucle principal, actualizamos la barra de progreso cada vez que la tarea de descarga avanza.
Conclusión
En este tutorial, aprendiste cómo crear aplicaciones multitarea con Tkinter. Usando hilos y objetos de bloqueo, puedes crear aplicaciones que puedan realizar varias tareas al mismo tiempo.