У меня есть класс потоков «MyThread» и мое основное приложение, которое просто называется «Gui». Я хочу создать несколько объектов из класса потоков, но для этого примера я создал только один объект. Класс thread выполняет некоторую работу, затем излучает сигнал в класс Gui, указывая на необходимость ввода пользователя (это указание на данный момент просто изменяет текст кнопки). Тогда поток должен ждать пользовательского ввода (в данном случае кнопка мыши), а затем продолжать делать то, что он делает ...PyQt4 Wait in thread для пользовательского ввода из GUI
from PyQt4 import QtGui, QtCore
class MyTrhead(QtCore.QThread):
trigger = QtCore.pyqtSignal(str)
def run(self):
print(self.currentThreadId())
for i in range(0,10):
print("working ")
self.trigger.emit("3 + {} = ?".format(i))
#### WAIT FOR RESULT
time.sleep(1)
class Gui(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(Gui, self).__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(self.btn)
self.t1 = MyTrhead()
self.t1.trigger.connect(self.dispaly_message)
self.t1.start()
print("thread: {}".format(self.t1.isRunning()))
@QtCore.pyqtSlot(str)
def dispaly_message(self, mystr):
self.pushButton.setText(mystr)
def btn(self):
print("Return result to corresponding thread")
if "__main__" == __name__:
import sys
app = QtGui.QApplication(sys.argv)
m = Gui()
m.show()
sys.exit(app.exec_())
Как я могу ждать (несколько) потоков для пользовательского ввода?
Спасибо за вашу помощь, еще один вопрос: Как я могу передать аргументы функции firstWork к GUI и передать результат обратно secondWork в случае, если у меня есть более чем один из этих работника потоки? Подумайте, функция firstWork задает вопрос, передает это пользователю, а вторая работа получает ответ? – Maecky
Измените декоратор слота на '@pyqtSlot ()', за которым следует одна и та же подпись функции, которая представляет слот 'def firstwork (self, )'. Например, '@pyqtSlot (int, str)' означает, что для слота требуются 2 аргумента (один из 'int' и другой типа' str'). Функция, которой принадлежит декоратор слота, должна выглядеть так: 'def firstWork (self, x, y)', где 'x' является' int' и 'y', являющимся« str' частями данных, передаваемых сигналом. Вы также должны изменить сигнал, полученный этим слотом: mySignal = pyqtSignal (int, str) '. –
rbaleksandar
@three_pineapples не забудьте подключить сигнал 'QThread.finished' к слову' self.worker.deleteLater'. – rbaleksandar