Итак, у меня есть все oop внутри объекта qrunable, и я хочу остановить его из основного потока при нажатии на кнопку. я думаю, что понимаю поток: мне нужен var, который я не могу передать от main к qrunable объекту (thread) и проверить его как условие для каждой итерации. Я просто не могу понять, как это реализовать. вот что я получил:
class WorkerSignals(QObject):
finished = pyqtSignal()
error = pyqtSignal(tuple)
result = pyqtSignal(object)
live = pyqtSignal(bool)
class Worker(QRunnable):
def __init__(self, fn, *args, **kwargs):
super(Worker, self).__init__()
self.fn = fn
self.args = args
self.kwargs = kwargs
self.signals = workerSignals.WorkerSignals()
@pyqtSlot()
def run(self):
# self.fn(*self.args, **self.kwargs)
try:
result = self.fn(*self.args, **self.kwargs)
except:
traceback.print_exc()
exctype, value = sys.exc_info()[:2]
self.signals.error.emit((exctype, value, traceback.format_exc()))
else:
self.signals.result.emit("done") # Return the result of the processing
finally:
self.signals.finished.emit() # Done
class Main(QWidget):
def __init__(self):
super().__init__()
self.title = 'Test'
self.setWindowTitle(self.title)
self.active = False
self.push_btn_start = QPushButton("Start")
self.push_btn_stop = QPushButton("Stop")
self.layout = QVBoxLayout()
self.layout.addWidget(self.push_btn_start)
self.layout.addWidget(self.push_btn_stop)
self.setLayout(self.layout)
self.msg = QMessageBox()
self.push_btn_start.clicked.connect(self.do_something)
self.threadpool = QThreadPool()
self.showMaximized()
def do_something(self):
self.worker = Worker(self.print_something)
self.worker.signals.finished.connect(self.thread_complete)
self.worker.signals.stop.connect(self.thread_stop)
self.threadpool.start(self.worker)
def print_something(self):
live = True
while live:
print("something...")
def thread_complete(self):
print("THREAD COMPLETE!")
QMessageBox.information(self,"Convert", "DONE")
def thread_stop(self):
print()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Main()
sys.exit(app.exec_())