Как показывать в QLabel сообщение «Выполняется ...» во время длительных расчетов?
Как отобразить в 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 шт):
Автор решения: S. Nick
→ Ссылка
Ваша проблема не в том как отобразить 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 чтобы начать его использовать.

