Как показывать в QLabel сообщение «Выполняется ...» во время длительных расчетов?

Рейтинг: 1Ответов: 1Опубликовано: 13.02.2023

Как отобразить в QLabel сообщение "Выполняется" сразу после двойного нажатия на элемент QListWidget, до выполнения процесса генерации цикла и до "Готово", чтобы пользователь видел, что процесс идёт?

main.py:

class Window2(QMainWindow):
    item_list = ['1','2','3','4','5']
    def __init__(self):
        super(Window2, self).__init__()

        self.setWindowTitle("Тестовое окно")
        self.setGeometry(300, 250, 550, 550)

        self.progress = QtWidgets.QLabel(self)
        self.progress.setText("Выполняется")
        self.progress.move(10, 10)
        self.progress.hide()

        self.result_label = QtWidgets.QListWidget(self)
        self.result_label.move(50,50)
        self.result_label.addItems(self.item_list)
        self.result_label.adjustSize()
        self.result_label.itemDoubleClicked.connect(self.click_item)

    def click_item(self, item):
        self.progress.show()
        x = [x for x in range(50000000)]
        print("Готово")

Ответы

▲ 1

Ваша проблема не в том как отобразить QLabel «Выполняется», а в том, что тяжелые/длительные расчеты должны выполняться в дополнительном потоке, иначе ваше приложение будет заморожено.

Один из возможных вариантов выглядит примерно так:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class Worker(QThread):
    progressChanged = pyqtSignal(int)
    
    def run(self):
        for count in range(50_000_000):
            self.progressChanged.emit(count)
            self.msleep(5)
        self.progressChanged.emit(-1)


class Window2(QWidget):                           # QMainWindow
    item_list = ['1', '2', '3', '4', '5']
    
    def __init__(self):
        super(Window2, self).__init__()

        self.setWindowTitle("Тестовое окно")
        self.resize(550, 550)

        self.progress = QtWidgets.QLabel(self)
        self.progress.setText("Выполняется  ... 50_000_000")
        self.progress.move(10, 10)
        self.progress.setFont(QFont("Copperplate Gothic Bold", 12))
        self.progress.adjustSize()
        self.progress.hide()

        self.result_label = QtWidgets.QListWidget(self)
        self.result_label.move(50, 50)
        self.result_label.addItems(self.item_list)
        self.result_label.adjustSize()
        self.result_label.itemDoubleClicked.connect(self.click_item)
    
        self.loader_file = QMovie("img/Fo2BxBK.gif")  # установите свою gif-ку
        self.loader_file.start()
        self.loader_label = QLabel(self) 
        self.loader_label.setMovie(self.loader_file)
        self.loader_label.adjustSize()
        self.loader_label.hide()
        self.overlayLabel = QLabel(
            '<h1 style="color: red">Please wait..<h1>', self.loader_label)
        self.overlayLabel.move(100, self.loader_label.height()-30)
        self.overlayLabel.show()

        self.worker = Worker()        
        self.worker.progressChanged.connect(self.updateProgress)

    def updateProgress(self, count):
        if count >= 0:
            self.progress.setText(f'Выполняется ... {count}')
        else:
            self.progress.setText(f'Процесс закончен.')
            self.loader_label.hide()

    def click_item(self, item):
        self.progress.show()
        self.loader_label.show()
        self.worker.start()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication([])
    ex = Window2()
    ex.show()
    sys.exit(app.exec_())

введите сюда описание изображения

введите сюда описание изображения

Я заменил виджет QMainWindow на виджет QWidget, потому что вам сначала надо почитать Qt Main Window Framework чтобы начать его использовать.