PyQt5: дождитесь сигнала перед продолжением функции

#python #pyqt5 #signals

#python #pyqt5 #сигналы

Вопрос:

используя PyQt5 в качестве интерфейса для моей программы, я написал функцию, которая активируется нажатием кнопки, и эта функция активирует (среди прочего) другую функцию, которая активирует поток, который работает над чем-то другим, пока первая функция выполняет свою работу. Моя проблема в том, что функция завершается намного быстрее, чем поток, и я хочу, чтобы программа дождалась завершения потока, прежде чем двигаться дальше, предпочтительно с опцией тайм-аута. Я знаю, что в PyQt5 есть сигналы, и я знаю, как запускать события на основе заданного сигнала, однако, как бы мне заставить программу ждать поступления сигнала?

Большое вам спасибо за помощь 🙂

пример кода того, что я хочу:

 class MyClass():
    def __init__():
        self.first_function()
        ....
        ....

    def first_function(self):
        ....
        ....
        self.second_function()
        wait_for_signal(timeout=30)

    def second_function(self):
        ....
        t = threading.Thread(target=self.thread_func)
        t.start()
        ....
        ....

    def thread_func(self):
        ....
        ....
        signal.emit()
  

Ответ №1:

Я не знаю точно, что вам нужно, но вот пример функции, которая в начале блокирует сигналы и в конце активирует их

 def show_acte_general(self):
        
        self.comboBox_2.blockSignals(True)
        self.comboBox_2.clear()
        self.comboBox_4.blockSignals(True)
        self.comboBox_4.clear()
        
        self.connection = psycopg2.connect(user="postgres", password="password", host="localhost", database="database")
        self.cur = self.connection.cursor()
        self.cur.execute('''SELECT items FROM read ORDER BY items ASC;''')
        data = self.cur.fetchall()

        for actes in data :
            self.comboBox_2.addItem(actes[0])
            self.comboBox_2.blockSignals(False)
            
            self.comboBox_4.addItem(actes[0])
            self.comboBox_4.blockSignals(False)