Форум сайта python.su
Всем привет.
Суть проблемы вот в чем. Есть кнопка в таблице которая обновляет данные в бд у одного элемента делая запрос на сервер.
Я сделал это так: сначала отправляется 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)
Офлайн
Я посмотрел на всё это и из моих глаз пошла кровь…
> Не пинайте если код вас режет глаза. Я только сегодня ознакомился с PyQt
Ну как же тебя не пинать если ты с PyQt познакомился, а с дизайнером нет.
Офлайн
Дизайнера нет, потому что в задании написано “рисовать кодом”.
Офлайн
вангую что c ТableWidget связано
запустите в консоли
python -v my_script
больше инфы будет
сегфолт чаще всего nullpointer
Офлайн
> Дизайнера нет, потому что в задании написано “рисовать кодом”.
Ты не поверишь но дизайнер таки рисует кодом.
Офлайн
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)
Офлайн
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)
Офлайн
Мил-человек у тебя как минимум виджеты не принадлежат экземпляру класса, а это значит что их может скушать мусорщик что как раз и приведёт к “Ошибка сегментирования”. По этому ты зря меня не слушаешь.
Офлайн