Графические интерфейсы Python:... Заметка
Planet Python на русском

Графические интерфейсы Python: Очистка при выходе — Остановка потоков при закрытии приложения PyQt6 — Как правильно завершать фоновые потоки и рабочие процессы при закрытии окна вашего приложения

Фоновые потоки в приложениях PyQt, управляемые QThreadPool или QThread, продолжают работать даже после закрытия главного окна. Это может привести к зависанию приложения или возникновению ошибок. Для решения этой проблемы переопределите метод closeEvent в классе вашего главного окна. Этот метод автоматически вызывается при начале закрытия окна, предоставляя возможность выполнить код очистки. Внутри closeEvent вы должны сигнализировать всем вашим фоновым рабочим о прекращении их выполнения. Для рабочих, реализованных как QRunnable, это обычно включает установку внутреннего флага, который метод run рабочего периодически проверяет. После сигнализации рабочим о прекращении работы используйте QThreadPool.waitForDone() для приостановки выполнения до тех пор, пока все потоки в пуле не завершат свои задачи. Это гарантирует, что ни один поток не будет внезапно завершен, предотвращая потенциальные проблемы. Наконец, вызовите event.accept(), чтобы разрешить нормальное закрытие окна. Также крайне важно обернуть выполнение цикла событий вашего приложения в sys.exit(), чтобы гарантировать чистое завершение процесса. Этот шаблон гарантирует, что все фоновые операции будут корректно остановлены до полного выхода из приложения.