Curso PyQt | QThread | Threads

Posted by


En este tutorial, vamos a aprender sobre cómo usar QThread en PyQt para trabajar con múltiples hilos en una aplicación de Python. Los hilos son útiles cuando se quiere realizar tareas que pueden tardar mucho tiempo en completarse, como cargar archivos grandes o realizar operaciones intensivas en el procesamiento de datos. Al ejecutar estas tareas en un hilo separado, se evita que la interfaz de usuario se congele o se vuelva insensible al interactuar con ella.

En PyQt, podemos crear y controlar hilos utilizando la clase QThread. Esta clase nos permitirá ejecutar tareas en un hilo separado mientras mantenemos la interfaz de usuario receptiva y activa. En este tutorial, vamos a crear una aplicación de PyQt simple que carga un archivo grande en un hilo separado utilizando QThread.

Para empezar, necesitamos instalar PyQt en nuestro entorno Python si aún no lo hemos hecho. Podemos hacer esto utilizando pip:

pip install PyQt5

Una vez que hayamos instalado PyQt, podemos comenzar a crear nuestra aplicación. Primero, importamos los módulos y clases necesarios de PyQt y creamos nuestra clase principal de la aplicación:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton
from PyQt5.QtCore import QThread

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle("Thread Example")

        self.label = QLabel("Status: Ready", self)
        self.label.move(50, 50)

        self.button = QPushButton("Load File", self)
        self.button.move(50, 100)
        self.button.clicked.connect(self.load_file)

    def load_file(self):
        self.label.setText("Status: Loading...")
        self.thread = LoadFileThread()
        self.thread.finished.connect(self.file_loaded)
        self.thread.start()

    def file_loaded(self):
        self.label.setText("Status: File Loaded")

En esta clase, creamos una ventana principal con una etiqueta y un botón. Cuando se hace clic en el botón, llamamos al método load_file(), que crea una instancia de LoadFileThread (que definiremos a continuación) y la inicia. Cuando el hilo ha terminado de cargar el archivo, se emite la señal finished, que está conectada al método file_loaded(), que actualiza el texto de la etiqueta.

A continuación, definimos la clase LoadFileThread, que hereda de QThread y carga un archivo en un hilo separado:

class LoadFileThread(QThread):
    def __init__(self):
        super(LoadFileThread, self).__init__()

    def run(self):
        # Simulate loading a file
        import time
        time.sleep(5)

En el método run(), simulamos la carga de un archivo mediante un retraso de 5 segundos utilizando time.sleep(). En una aplicación real, este sería el lugar donde cargaríamos el archivo en sí. Una vez que se ha completado la carga, el hilo termina automáticamente y emite la señal finished.

Finalmente, creamos una instancia de QApplication, QMainWindow y MainWindow, y ejecutamos la aplicación:

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

Con esto, hemos creado una aplicación de PyQt que carga un archivo en un hilo separado utilizando QThread. Este es un ejemplo simple, pero demuestra cómo se pueden utilizar hilos para mantener la interfaz de usuario receptiva al realizar tareas que pueden tardar mucho tiempo en completarse.

Es importante tener en cuenta que al trabajar con hilos en PyQt, debemos tener en cuenta la concurrencia y posibles problemas de sincronización. Es recomendable utilizar mecanismos como señales y ranuras de Qt para comunicarse entre hilos de forma segura y eficiente.

Espero que este tutorial te haya sido útil y te haya ayudado a comprender cómo trabajar con hilos en PyQt utilizando QThread. ¡Buena suerte y feliz codificación!