В есть модифицированный код от This AnswerPyQt - Как имитировать сигнал? Или какое-то другое решение?
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import time
class MyWorker(QObject):
@pyqtSlot()
def firstWork(self):
print ('doing first work')
time.sleep(2)
print ('first work done')
@pyqtSlot()
def secondWork(self):
print ('doing second work')
time.sleep(2)
print ('second work done')
class Window(QWidget):
def __init__(self, parent = None):
super(Window, self).__init__()
self.initUi()
self.setupThread()
def initUi(self):
layout = QVBoxLayout()
self.button1 = QPushButton('1')
self.button2 = QPushButton('2')
layout.addWidget(self.button1)
layout.addWidget(self.button2)
self.setLayout(layout)
self.show()
def setupThread(self):
self.thread = QThread()
self.worker = MyWorker()
self.worker.moveToThread(self.thread)
self.button2.clicked.connect(self.worker.secondWork)
self.button1.clicked.connect(self.worker.firstWork)
# Start thread
self.thread.start()
if __name__ == "__main__":
app = QApplication([])
w = Window()
app.exec_()
Все работает отлично, но я хочу, чтобы начать методы в отдельных потоках с помощью простой строки кода, а не сигналами событий.
Было ли это, как это сделать?
Нечто подобное self.worker.secondWork()
вместо события от кнопки self.button2.clicked.connect(self.worker.secondWork)
(Это, конечно, не работает)
Единственный способ я нашел с моим мастерством, создают невидимую кнопку и моделировать его щелчок событие для этого, но она не является Хорошее решение, конечно!
Вопрос, с которым вы связались, уже дал вам код для решения этой проблемы, поэтому я не уверен, почему вы удалили это из своего примера. Все, что вам нужно сделать, это подключить сигнал «thread.started» к двум рабочим слотам. Также нет необходимости подключать кнопки, так как вы ничего не отправляете работнику. – ekhumoro
Я не знал, что сигнал может работать в противоположном направлении –