Multitasking: PyQt Threads for Interface and Progress Bar

Posted by


Neste tutorial, vamos abordar como criar uma aplicação em PyQt que executa múltiplas tarefas de forma simultânea utilizando threads, e exibe uma barra de progresso para acompanhar o progresso de cada tarefa.

PyQt é uma biblioteca de interface gráfica para Python que permite criar aplicativos GUI de forma fácil e eficiente. Com a ajuda de threads, é possível executar várias tarefas em paralelo, mantendo a interface do aplicativo responsiva.

Vamos começar definindo a interface gráfica da nossa aplicação. Para isso, iremos criar uma janela principal com uma barra de progresso e um botão para iniciar as tarefas:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QPushButton, QProgressBar, QWidget

class App(QMainWindow):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.setWindowTitle('Multitarefas com PyQt Threads')
        self.setGeometry(100, 100, 400, 200)

        layout = QVBoxLayout()

        self.progress_bar = QProgressBar()
        layout.addWidget(self.progress_bar)

        self.start_button = QPushButton('Iniciar Tarefas')
        self.start_button.clicked.connect(self.start_tasks)
        layout.addWidget(self.start_button)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def start_tasks(self):
        pass

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = App()
    window.show()
    sys.exit(app.exec_())

Neste código, criamos uma classe App que herda de QMainWindow e definimos o método initUI() para criar a interface gráfica da aplicação. A janela possui uma barra de progresso e um botão para iniciar as tarefas. Quando o botão for clicado, o método start_tasks() será chamado.

Agora, vamos implementar a lógica para executar as tarefas em threads e atualizar a barra de progresso conforme o progresso de cada tarefa:

import time
from PyQt5.QtCore import QThread, pyqtSignal

class Worker(QThread):
    update_progress = pyqtSignal(int)

    def __init__(self):
        super().__init()

    def run(self):
        for i in range(1, 101):
            time.sleep(0.1)
            self.update_progress.emit(i)

class App(QMainWindow):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        # Código da interface gráfica

        self.worker = Worker()
        self.worker.update_progress.connect(self.update_progress)

    def start_tasks(self):
        self.worker.start()

    def update_progress(self, value):
        self.progress_bar.setValue(value)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = App()
    window.show()
    sys.exit(app.exec_())

Neste código, criamos uma subclasse de QThread chamada Worker, que executará as tarefas em paralelo. A cada iteração do loop no método run(), o sinal update_progress é emitido com o valor atual do progresso. Também conectamos este sinal ao método update_progress() da classe App, que atualiza a barra de progresso com o valor recebido.

Agora, nossa aplicação está pronta para executar múltiplas tarefas em threads e atualizar a barra de progresso de forma assíncrona. Você pode adicionar mais lógica à classe Worker para realizar tarefas específicas de acordo com suas necessidades.

Espero que este tutorial tenha sido útil para você criar uma aplicação com multitarefas e barra de progresso em PyQt usando threads. Se tiver alguma dúvida ou sugestão, não hesite em deixar um comentário. Obrigado por ler!