Форум сайта python.su
4
Всем привет.
Суть проблемы вот в чем. Есть кнопка в таблице которая обновляет данные в бд у одного элемента делая запрос на сервер.
Я сделал это так: сначала отправляется GET запрос на обновление элемента. Потом делается запрос на сервер для выборки всех элемнтов и отображение в таблице.
Но проблема в том, что если нажать на кнопку 1 раз то все в таблице обновится, а на 2 клике по кнопку вываливается ошибка
В терминале
Ошибка сегментирования (сделан дамп памяти)
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
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_())
Отредактировано balalay12 (Апрель 10, 2018 15:25:30)
Офлайн
186
Я посмотрел на всё это и из моих глаз пошла кровь…
> Не пинайте если код вас режет глаза. Я только сегодня ознакомился с PyQt
Ну как же тебя не пинать если ты с PyQt познакомился, а с дизайнером нет.
Офлайн
4
Дизайнера нет, потому что в задании написано “рисовать кодом”.
Офлайн
вангую что c ТableWidget связано
запустите в консоли
python -v my_script
больше инфы будет
сегфолт чаще всего nullpointer
Офлайн
186
> Дизайнера нет, потому что в задании написано “рисовать кодом”.
Ты не поверишь но дизайнер таки рисует кодом.
Офлайн
4
vic57Не скажу, что мне понятнее стало. Странно, что этот бэктрэйс вываливается не всегда когда отваливается программа.
вангую что c ТableWidget связанозапустите в консоли python -v my_scriptбольше инфы будетсегфолт чаще всего nullpointer
*** Error in `/home/danil/projects/sima_land/venv/bin/python': malloc(): memory corruption (fast): 0x0000000001eb3cff *** ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fe54c8097e5] /lib/x86_64-linux-gnu/libc.so.6(+0x82651)[0x7fe54c814651] /lib/x86_64-linux-gnu/libc.so.6(__libc_malloc+0x54)[0x7fe54c816184] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Core.so.5(_ZN9QListData11detach_growEPii+0x42)[0x7fe54aa86622] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Network.so.5(+0x60bd8)[0x7fe542eb6bd8] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Network.so.5(+0x60d05)[0x7fe542eb6d05] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Network.so.5(+0xdc692)[0x7fe542f32692] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Network.so.5(_ZN20QNetworkProxyFactory13proxyForQueryERK18QNetworkProxyQuery+0x5a)[0x7fe542f32c8a] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Network.so.5(+0x5bd70)[0x7fe542eb1d70] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Network.so.5(+0x7c7dd)[0x7fe542ed27dd] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Network.so.5(+0x7e2f0)[0x7fe542ed42f0] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Network.so.5(+0x7e54b)[0x7fe542ed454b] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Network.so.5(+0x7eb28)[0x7fe542ed4b28] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Network.so.5(_ZN21QNetworkAccessManager13createRequestENS_9OperationERK15QNetworkRequestP9QIODevice+0x1b0)[0x7fe542eb1f30] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/QtNetwork.so(+0x818d0)[0x7fe54326d8d0] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Network.so.5(_ZN21QNetworkAccessManager3getERK15QNetworkRequest+0x14)[0x7fe542eaf4d4] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/QtNetwork.so(+0x56ab4)[0x7fe543242ab4] /home/danil/projects/sima_land/venv/bin/python(PyCFunction_Call+0x4f)[0x4e9b7f] /home/danil/projects/sima_land/venv/bin/python(PyEval_EvalFrameEx+0x614)[0x5372f4] /home/danil/projects/sima_land/venv/bin/python(PyEval_EvalCodeEx+0x13b)[0x540f9b] /home/danil/projects/sima_land/venv/bin/python[0x4ebd23] /home/danil/projects/sima_land/venv/bin/python(PyObject_Call+0x47)[0x5c1797] /home/danil/projects/sima_land/venv/bin/python[0x4fb9ce] /home/danil/projects/sima_land/venv/bin/python(PyObject_Call+0x47)[0x5c1797] /home/danil/projects/sima_land/venv/bin/python(PyEval_CallObjectWithKeywords+0x30)[0x534d90] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/QtCore.so(+0x1dbe15)[0x7fe54b2b6e15] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/QtCore.so(+0x1dc320)[0x7fe54b2b7320] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/QtCore.so(+0x1dc59b)[0x7fe54b2b759b] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/QtCore.so(+0x1dd377)[0x7fe54b2b8377] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Core.so.5(_ZN11QMetaObject8activateEP7QObjectiiPPv+0x7c4)[0x7fe54ac35394] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Widgets.so.5(_ZN15QAbstractButton7clickedEb+0x32)[0x7fe546b27032] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Widgets.so.5(+0x24a234)[0x7fe546b27234] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Widgets.so.5(+0x24bdce)[0x7fe546b28dce] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Widgets.so.5(_ZN15QAbstractButton17mouseReleaseEventEP11QMouseEvent+0xd5)[0x7fe546b28f25] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/QtWidgets.so(+0x2fd533)[0x7fe547414533] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Widgets.so.5(_ZN7QWidget5eventEP6QEvent+0x1f8)[0x7fe546a73018] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/QtWidgets.so(+0x363e03)[0x7fe54747ae03] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Widgets.so.5(_ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent+0x9c)[0x7fe546a3663c] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Widgets.so.5(_ZN12QApplication6notifyEP7QObjectP6QEvent+0xc03)[0x7fe546a3e363] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/QtWidgets.so(+0x36bc9e)[0x7fe547482c9e] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Core.so.5(_ZN16QCoreApplication15notifyInternal2EP7QObjectP6QEvent+0x108)[0x7fe54ac0a028] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Widgets.so.5(_ZN19QApplicationPrivate14sendMouseEventEP7QWidgetP11QMouseEventS1_S1_PS1_R8QPointerIS0_Eb+0x1df)[0x7fe546a3cfcf] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Widgets.so.5(+0x1afb3d)[0x7fe546a8cb3d] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Widgets.so.5(+0x1b2453)[0x7fe546a8f453] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Widgets.so.5(_ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent+0x9c)[0x7fe546a3663c] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Widgets.so.5(_ZN12QApplication6notifyEP7QObjectP6QEvent+0x227)[0x7fe546a3d987] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/QtWidgets.so(+0x36bc9e)[0x7fe547482c9e] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Core.so.5(_ZN16QCoreApplication15notifyInternal2EP7QObjectP6QEvent+0x108)[0x7fe54ac0a028] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Gui.so.5(_ZN22QGuiApplicationPrivate17processMouseEventEPN29QWindowSystemInterfacePrivate10MouseEventE+0x370)[0x7fe546228300] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Gui.so.5(_ZN22QGuiApplicationPrivate24processWindowSystemEventEPN29QWindowSystemInterfacePrivate17WindowSystemEventE+0x105)[0x7fe54622a0d5] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Gui.so.5(_ZN22QWindowSystemInterface22sendWindowSystemEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE+0xbb)[0x7fe54620582b] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/plugins/platforms/../../lib/libQt5XcbQpa.so.5(+0xd8b8b)[0x7fe54297ab8b] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Core.so.5(_ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE+0xea)[0x7fe54ac0889a] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/Qt/lib/libQt5Core.so.5(_ZN16QCoreApplication4execEv+0x84)[0x7fe54ac11424] /home/danil/projects/sima_land/venv/lib/python3.5/site-packages/PyQt5/QtWidgets.so(+0x1f73e0)[0x7fe54730e3e0] /home/danil/projects/sima_land/venv/bin/python(PyCFunction_Call+0x4f)[0x4e9b7f] /home/danil/projects/sima_land/venv/bin/python(PyEval_EvalFrameEx+0x614)[0x5372f4] /home/danil/projects/sima_land/venv/bin/python[0x540199] /home/danil/projects/sima_land/venv/bin/python(PyEval_EvalCode+0x1f)[0x540e4f] /home/danil/projects/sima_land/venv/bin/python[0x60c272] /home/danil/projects/sima_land/venv/bin/python(PyRun_FileExFlags+0x9a)[0x60e71a] /home/danil/projects/sima_land/venv/bin/python(PyRun_SimpleFileExFlags+0x1bc)[0x60ef0c] /home/danil/projects/sima_land/venv/bin/python(Py_Main+0x456)[0x63fb26]
Офлайн
def createTable(self): self.table.clear()# вставь сюда 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')# лучше через contextMenuEvent по ПКМ 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)
Офлайн
4
vic57
Я тоже думал про очистку таблицы. Пробовал 2 варианта
self.table.setRowCount(0) self.table.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())
Отредактировано balalay12 (Апрель 10, 2018 18:35:55)
Офлайн
ну альтернативно попробуй requests, Qt - для гуя
и print понаставь чтобы данные видеть
мне кажется, неправильно кнопки так в цикле создавать - ты их нигде не удаляешь
self.btns = []# clear buttons for i in ... self.btns.append(QPushButton..) for i in self.btns: i.connect...
Отредактировано vic57 (Апрель 10, 2018 18:50:49)
Офлайн
186
Мил-человек у тебя как минимум виджеты не принадлежат экземпляру класса, а это значит что их может скушать мусорщик что как раз и приведёт к “Ошибка сегментирования”. По этому ты зря меня не слушаешь.
Офлайн