2017-02-03 10 views
0

В есть модифицированный код от 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) (Это, конечно, не работает)

Единственный способ я нашел с моим мастерством, создают невидимую кнопку и моделировать его щелчок событие для этого, но она не является Хорошее решение, конечно!

+0

Вопрос, с которым вы связались, уже дал вам код для решения этой проблемы, поэтому я не уверен, почему вы удалили это из своего примера. Все, что вам нужно сделать, это подключить сигнал «thread.started» к двум рабочим слотам. Также нет необходимости подключать кнопки, так как вы ничего не отправляете работнику. – ekhumoro

+0

Я не знал, что сигнал может работать в противоположном направлении –

ответ

0

Я решил это, добавив пользовательский сигнал PyQt.

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): 

    Signal = pyqtSignal() 

    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.Signal.connect(self.worker.secondWork) 
     self.Signal.connect(self.worker.firstWork) 

     self.thread.start() 
     self.Signal.emit() 

if __name__ == "__main__": 
    app = QApplication([]) 
    w = Window() 
    app.exec_()