Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

Григорий Лелетин Ученик (237), на голосовании 2 дня назад
Всем здравствуйте! Возник вопрос, не могу решить.
У меня есть основное окно:
 class Ui_program(object): 
def setupUi(self, program):
program.setObjectName("Program")...
 import sys 
app = QtWidgets.QApplication(sys.argv)
program = QtWidgets.QMainWindow()
ui.setupUi(program)
program.show()
sys.exit(app.exec_())
Мне необходимо, чтобы при нажатии на кнопку запускался поток, где запускается def show_settings: (классы двух окон ОТЛИЧАЮТСЯ: Главное окно: Ui_program(), а второе: Settings())
 self.settings_button.clicked.connect(self.open_settings) 
 def open_settings(self):
settings = threading.Thread(target = Settings.show_settings) # Классы двух окон ОТЛИЧАЮТСЯ.
settings.start()
 class Settings(object): 
def __init__(self, parent = None): # Это я по интернету пытался понять
super().__init__()
self.parent = parent
configurator = QtWidgets.QMainWindow()
self.setupSettingsUi(configurator)

def setupSettingsUi(self, configurator):
configurator.setObjectName("configurator")...
Когда запускаю и нажимаю, в консоль пишет:
 WARNING: QApplication was not created in the main() thread. 
QBasicTimer::start: Timers cannot be started from another thread
Что делать? Если нужно, задавайте вопросы
Дополнен 1 месяц назад
31.05.2024 19:52 Проблема до сих пор не решена. Пожалуйста, помогите.
Голосование за лучший ответ
Богдан Петров Ученик (123) 1 месяц назад
Не по теме.
Ты ботов на aiogram 3 умеешь делать?
Григорий ЛелетинУченик (237) 1 месяц назад
ну так по документации всё можно:)
Богдан ПетровУченик (123) 1 месяц назад
Я не могу(
Богдан ПетровУченик (123) 1 месяц назад
Как её читать вообще?
GGG Просветленный (26024) 1 месяц назад
Для того, чтобы избежать проблем с потоками в 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() окна настроек, который будет вызываться при запуске потока. Наконец, мы запускаем поток.
Арсений КопёнкинУченик (125) 1 месяц назад
жиииииииииииииииииииииииииир
Григорий ЛелетинУченик (237) 1 месяц назад
Я понимаю, что нейросети стали очень качественными и может в какой мере точными, но этот код не работает! Хотя бы потому, что при тесте этого же кода, не изменяя его, программа выдаёт ошибку:
 QObject::moveToThread: Widgets cannot be moved to a new thread 
QThread: Destroyed while thread is still running
Похожие вопросы