Как отобразить окно сообщения, когда задача активна в PyQt: объяснение нескольких методов

Вот статья в блоге, в которой представлены несколько методов и примеры кода для отображения окна сообщения в PyQt, когда задача активна.

В PyQt отображение окна сообщения во время активной задачи может быть полезным способом предоставления уведомлений или сбора данных пользователя, не прерывая его рабочий процесс. В этой статье мы рассмотрим различные методы достижения этой функциональности, сопровождаемые примерами кода.

Методы:

  1. Использование QTimer:
    Один из подходов — использовать класс QTimer PyQt для периодической проверки статуса задачи и отображения соответствующего окна сообщения. Вот пример:
from PyQt5.QtWidgets import QApplication, QMessageBox, QWidget
from PyQt5.QtCore import QTimer
class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.setWindowTitle("Message Box Example")
        # ...
        # Start the task
        self.startTask()
    def startTask(self):
        # Start your task here
        # ...
        # Create a QTimer
        self.timer = QTimer()
        self.timer.timeout.connect(self.checkTaskStatus)
        self.timer.start(1000)  # Check every 1 second
    def checkTaskStatus(self):
        # Check the task status
        if task_is_active:
            QMessageBox.information(self, "Task Status", "Task is still active.")
        # Stop the timer if the task is completed
        else:
            self.timer.stop()
if __name__ == '__main__':
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec_()
  1. Использование QThread:
    Другой метод — создать отдельный поток для задачи и использовать сигналы для связи с основным потоком для отображения окна сообщения. Вот пример:
from PyQt5.QtWidgets import QApplication, QMessageBox, QWidget
from PyQt5.QtCore import QThread, pyqtSignal
class WorkerThread(QThread):
    task_status = pyqtSignal(bool)
    def run(self):
        # Perform your task here
        # ...
        # Emit the task status signal
        self.task_status.emit(task_is_active)
class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.setWindowTitle("Message Box Example")
        # ...
        # Start the task
        self.startTask()
    def startTask(self):
        self.thread = WorkerThread()
        self.thread.task_status.connect(self.showTaskStatus)
        self.thread.start()
    def showTaskStatus(self, is_active):
        if is_active:
            QMessageBox.information(self, "Task Status", "Task is still active.")
        else:
            self.thread.quit()
if __name__ == '__main__':
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec_()
  1. Использование QProgressDialog:
    Класс QProgressDialog предоставляет встроенный диалог прогресса с дополнительным окном сообщения. Вы можете использовать это для отображения статуса задачи, пока задача активна. Вот пример:
from PyQt5.QtWidgets import QApplication, QMessageBox, QWidget, QProgressDialog
class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.setWindowTitle("Message Box Example")
        # ...
        # Start the task
        self.startTask()
    def startTask(self):
        progress_dialog = QProgressDialog("Task is active...", None, 0, 0, self)
        progress_dialog.setWindowTitle("Task Status")
        progress_dialog.setCancelButton(None)  # Remove the cancel button
        progress_dialog.setWindowModality(True)  # Make the dialog modal
        progress_dialog.show()
        # Start your task here
        # ...
        # Close the dialog when the task is completed
        progress_dialog.close()
if __name__ == '__main__':
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec_()

В этой статье мы рассмотрели несколько способов отображения окна сообщения, когда задача активна в PyQt. Мы рассмотрели использование QTimer, QThread и QProgressDialog, приведя примеры кода для каждого подхода. Реализуя эти методы, вы можете обеспечить удобство работы пользователей, одновременно информируя их о ходе выполнения задачи.