Суть проблемы вот в чем. Есть кнопка в таблице которая обновляет данные в бд у одного элемента делая запрос на сервер.
Я сделал это так: сначала отправляется GET запрос на обновление элемента. Потом делается запрос на сервер для выборки всех элемнтов и отображение в таблице.
Но проблема в том, что если нажать на кнопку 1 раз то все в таблице обновится, а на 2 клике по кнопку вываливается ошибка
В терминале
Ошибка сегментирования (сделан дамп памяти)
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
Не пинайте если код вас режет глаза. Я только сегодня ознакомился с PyQt + Tornado из-за необходимости.
код клиента
import sys import json from PyQt5.QtCore import QUrl, QByteArray from PyQt5.QtWidgets import ( QApplication, QWidget, QLabel, QLineEdit, QTextEdit, QTableWidget, QTableWidgetItem, QPushButton, QHBoxLayout, QVBoxLayout, qApp, ) from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply class App(QWidget): def __init__(self): super().__init__() self.tasks = dict() self.task_name_edit = QLineEdit() # self.task_desc_edit = QTextEdit() self.task_desc_edit = QLineEdit() self.table = QTableWidget() self.table.setRowCount(1) self.table.setColumnCount(6) self.table.setHorizontalHeaderLabels(["Задача", "Описание", "Создано", "Выполнено", "", ""]) self.initUI() def initUI(self): task_name = QLabel('Задача') task_desc = QLabel('Описание') okButton = QPushButton('OK') okButton.clicked.connect(self.createTask) cancelButton = QPushButton('Очистить') cancelButton.clicked.connect(self.clearInputs) fetchbutton = QPushButton('Получить список всех задач') fetchbutton.clicked.connect(self.fetchTasks) name_field = QHBoxLayout() name_field.addWidget(task_name) name_field.addWidget(self.task_name_edit) desc_field = QHBoxLayout() desc_field.addWidget(task_desc) desc_field.addWidget(self.task_desc_edit) btns = QHBoxLayout() btns.addWidget(okButton) btns.addWidget(cancelButton) vbox = QVBoxLayout() vbox.addLayout(name_field) vbox.addLayout(desc_field) vbox.addLayout(btns) vbox.addWidget(fetchbutton) vbox.addWidget(self.table) self.setLayout(vbox) self.setWindowTitle('test case') self.show() def clearInputs(self): self.task_name_edit.clear() self.task_desc_edit.clear() def fetchTasks(self): url = 'http://localhost:8888' req = QNetworkRequest(QUrl(url)) self.nam = QNetworkAccessManager() self.nam.finished.connect(self.fetchTasksResponse) self.nam.get(req) def fetchTasksResponse(self, reply): er = reply.error() if er == QNetworkReply.NoError: bytes_string = reply.readAll() print(bytes_string) self.tasks.clear() self.tasks = json.loads(str(bytes_string, 'utf-8')) self.createTable() else: print('Error ', er) print(reply.errorString()) def createTask(self): data = QByteArray() data.append("name={}&description={}".format( self.task_name_edit.text(), # self.task_desc_edit.toPlainText() self.task_desc_edit.text(), )) url = 'http://localhost:8888' req = QNetworkRequest(QUrl(url)) req.setHeader(QNetworkRequest.ContentTypeHeader, "application/x-www-form-urlencoded") self.nam = QNetworkAccessManager() self.nam.finished.connect(self.handleResponse) self.nam.post(req, data) def handleResponse(self, reply): er = reply.error() if er == QNetworkReply.NoError: bytes_string = reply.readAll() print(str(bytes_string, 'utf-8')) else: print('Error ', er) print(reply.errorString()) def createTable(self): rows = len(self.tasks) cols = 6 self.table.setRowCount(rows) self.table.setColumnCount(cols) for row in range(0,rows): self.table.setItem(row, 0, QTableWidgetItem(self.tasks[row]['name'])) self.table.setItem(row, 1, QTableWidgetItem(self.tasks[row]['description'])) self.table.setItem(row, 2, QTableWidgetItem(self.tasks[row]['create'])) self.table.setItem(row, 3, QTableWidgetItem(self.tasks[row]['complete'])) self.btnComplete = QPushButton('Complete') self.btnComplete.clicked.connect(self.completeBtnEvent) self.table.setCellWidget(row, 4, self.btnComplete) self.btnDelete = QPushButton('Delete') self.btnDelete.clicked.connect(self.deleteButtonEvent) self.table.setCellWidget(row, 5, self.btnDelete) def completeBtnEvent(self): button = qApp.focusWidget() index = self.table.indexAt(button.pos()) url = 'http://localhost:8888/complete/{}/'.format(self.tasks[index.row()]['id']) print(url) req = QNetworkRequest(QUrl(url)) self.nam = QNetworkAccessManager() self.nam.finished.connect(self.actionHandler) self.nam.get(req) def deleteButtonEvent(self): button = qApp.focusWidget() index = self.table.indexAt(button.pos()) url = 'http://localhost:8888/delete/{}/'.format(self.tasks[index.row()]['id']) req = QNetworkRequest(QUrl(url)) self.nam = QNetworkAccessManager() self.nam.finished.connect(self.actionHandler) self.nam.get(req) def actionHandler(self, reply): er = reply.error() if er == QNetworkReply.NoError: self.fetchTasks() else: print('Error ', er) print(reply.errorString()) if __name__ == '__main__': app = QApplication(sys.argv) ex = App() ex.resize(700, 500) sys.exit(app.exec_())