Для того, чтобы избежать проблем с потоками в 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() окна настроек, который будет вызываться при запуске потока. Наконец, мы запускаем поток.
У меня есть основное окно: Мне необходимо, чтобы при нажатии на кнопку запускался поток, где запускается def show_settings: (классы двух окон ОТЛИЧАЮТСЯ: Главное окно: Ui_program(), а второе: Settings()) Когда запускаю и нажимаю, в консоль пишет: Что делать? Если нужно, задавайте вопросы