#python #pyqt5
У меня есть два окна. Основное, которое выполняет некую функцию, используя при этом потоки. В определённый момент, основное окно вызывает побочное(окно уведомления). Если я не использую потоки, всё работает в норме, если использую. То окно уведомления появляется на короткий миг, в который оно не доступно, после чего исчезает(также возможно выставить sleep, чтобы проверить это). Вопрос: как организовать вызов второго окна, во время выполнения потоков в первом. def thread(my_func): """ Run function in a different thread """ def wrapper(*args, **kwargs): my_thread = threading.Thread(target=my_func, args=args, kwargs=kwargs) my_thread.start() return wrapper # Окно уведомлений class MsgBox(QWidget): def __init__(self): super(MsgBox, self).__init__() self.setFixedSize(200, 50) self.location_on_the_screen() self.setWindowTitle('Сообщение') self.lbl = QtWidgets.QLabel('', self) self.lbl.setOpenExternalLinks(True) self.lbl.move(15, 10) self.lbl.setText(self.message) # Основное окно class Ui_Form(QMainWindow): # signal value for thread my_signal = QtCore.pyqtSignal(list, name='my_signal') def setupUi(self, Form): # По клику выполняется метод func self.button.clicked.connect(lambda: self.func(self.my_signal)) # Обработчик сигнала self.my_signal.connect(self.mySignalHandler, QtCore.Qt.QueuedConnection) # Метод создания окна уведомлений def create_window(self): second_window = MsgBox() second_window.show() # Метод основной, выполняется с потоками @thread def func(self,my_signal): ....... self.create_window() ...... # Вызов if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) Form = QMainWindow() ui = Ui_Form() ui.get_from_config_file() ui.setupUi(Form) Form.show() sys.exit(app.exec_())
Ответы
Ответ 1
Пример с потоком, который выводит второе окно, как приходит сообщение из потока. При этом не блокируется ни основное окно, ни дополнительное. from PyQt5 import Qt class WorkThread(Qt.QThread): threadSignal = Qt.pyqtSignal(int) def __init__(self): super().__init__() def run(self, *args, **kwargs): c = 0 while True: Qt.QThread.msleep(1000) c += 1 self.threadSignal.emit(c) return Qt.QThread.run(self, *args, **kwargs) class MsgBox(Qt.QDialog): def __init__(self): super().__init__() layout = Qt.QVBoxLayout(self) self.label = Qt.QLabel("") layout.addWidget(self.label) close_btn = Qt.QPushButton("Close") close_btn.clicked.connect(self.close) layout.addWidget(close_btn) self.resize(50, 50) class MainWindow(Qt.QMainWindow): def __init__(self): super().__init__() self.resize(300, 200) self.btn = Qt.QPushButton("Run thread!") self.btn.clicked.connect(self.on_btn) self.msg = MsgBox() self.setCentralWidget(self.btn) self.thread = None def on_btn(self): if self.thread is None: self.thread = WorkThread() self.thread.threadSignal.connect(self.on_threadSignal) self.thread.start() self.btn.setText("Stop thread") else: self.thread.terminate() self.thread = None self.btn.setText("Start thread") def on_threadSignal(self, value): self.msg.label.setText(str(value)) if not self.msg.isVisible(): self.msg.show() if __name__ == '__main__': app = Qt.QApplication([]) mw = MainWindow() mw.show() app.exec()
Комментариев нет:
Отправить комментарий