Ответы Mail.ru: Как открывать окно PyQt5 в другом потоке threading.Thread (Python)

Для того, чтобы избежать проблем с потоками в PyQt5, необходимо использовать QThread вместо threading.Thread. QThread предоставляет интеграцию с событийным циклом Qt, что позволяет безопасно взаимодействовать с графическими элементами из другого потока.

Вот как вы можете изменить ваш код:

 from PyQt5 import QtCore, QtWidgets 
import sys 
 
class Ui_program(QtWidgets.QMainWindow): 
    def __init__(self): 
        super().__init__() 
        self.setupUi() 
 
    def setupUi(self): 
        self.setObjectName("Program") 
        # ... 
        self.settings_button = QtWidgets.QPushButton("Settings", self) 
        self.settings_button.clicked.connect(self.open_settings) 
 
    def open_settings(self): 
        self.settings_thread = QtCore.QThread() 
        self.settings_window = Settings() 
        self.settings_window.moveToThread(self.settings_thread) 
        self.settings_thread.started.connect(self.settings_window.show_settings) 
        self.settings_thread.start() 
 
class Settings(QtWidgets.QMainWindow): 
    def __init__(self, parent=None): 
        super().__init__(parent) 
        self.setupSettingsUi() 
 
    def setupSettingsUi(self): 
        self.setObjectName("configurator") 
        # ... 
 
    def show_settings(self): 
        self.show() 
 
app = QtWidgets.QApplication(sys.argv) 
program = Ui_program() 
program.show() 
sys.exit(app.exec_()) 
 

В этом коде, мы создаем новый QThread и перемещаем окно настроек в этот поток с помощью метода moveToThread(). Затем, мы подключаем сигнал started потока к методу show_settings() окна настроек, который будет вызываться при запуске потока. Наконец, мы запускаем поток.