Остановка работы воркера после остановки потока PyQT5 Python Qthread
У меня есть небольшой графический интерфейс на PyQT5. Есть главное окно с таблицей и кнопкой "Считать". При нажатии на кнопку стартует дополнительный поток Qthread, куда методом moveToThread помещен воркер FillTableWorker. При нажатии на кнопку "Отмена" я останавливаю поток, но воркер продолжает работать и заполняет таблицу данными.
def stop_reading_thread(self):
self.table_thread.quit()
Так же я добавил в воркер флаг is_running, который устанавливаю в False, чтобы воркер прекратил цикл, но он все равно его продолжает, флаг не устанавливается.
self.fill_in_table_widget.stop()
Как мне по нажатию на кнопку из главного окна останавливать поток и завершать работу воркера?
Полный код:
class FillTableWorker(QtCore.QObject):
running = True
new_table_row = QtCore.pyqtSignal(int, object)
exit_thread = QtCore.pyqtSignal(bool)
def __init__(self):
super().__init__()
self.i = 0
self.is_running = True
def run(self):
i = self.i
self.total_events_count.emit(len(session.query(Event).all()))
for event in session.query(Event).all():
if self.is_running == True:
list = [
QTableWidgetItem(str(i+1)),
QTableWidgetItem(str(event.date_time)),
QTableWidgetItem(str(event.bku)),
QTableWidgetItem(str(event.kl)),
QTableWidgetItem(str(event.au)),
QTableWidgetItem(str(event.channel)),
QTableWidgetItem(str(event.event_code)),
QTableWidgetItem(str(event.addit_param)),
QTableWidgetItem(str(event.description)),
QColor(codes_dictionary[event.event_code][1])
]
self.new_table_row.emit(i, list)
i += 1
self.stop()
self.exit_thread.emit(True)
def stop(self):
self.is_running == False
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# конфигурация главного окна и центрального виджета
self.central_widget = QWidget(self)
self.setGeometry(50, 50, 1500, 800)
self.setWindowTitle('Чтение БКУ')
self.table_thread = QtCore.QThread()
self.fill_in_table_widget = FillTableWorker()
self.fill_in_table_widget.moveToThread(self.table_thread)
self.fill_in_table_widget.new_table_row.connect(self.add_row_in_table)
@QtCore.pyqtSlot(bool)
def stop_reading_thread(self):
self.fill_in_table_widget.stop()
self.table_thread.quit()
@QtCore.pyqtSlot(int, object)
def add_row_in_table(self, i, list):
print(list)
Источник: Stack Overflow на русском