Найти - Пользователи
Полная версия: PyQt5 обновлкние данных
Начало » GUI » PyQt5 обновлкние данных
1 2
balalay12
Всем привет.

Суть проблемы вот в чем. Есть кнопка в таблице которая обновляет данные в бд у одного элемента делая запрос на сервер.
Я сделал это так: сначала отправляется GET запрос на обновление элемента. Потом делается запрос на сервер для выборки всех элемнтов и отображение в таблице.
Но проблема в том, что если нажать на кнопку 1 раз то все в таблице обновится, а на 2 клике по кнопку вываливается ошибка
В терминале
Ошибка сегментирования (сделан дамп памяти)
В PyCharm
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_())
Rodegast
Я посмотрел на всё это и из моих глаз пошла кровь…

> Не пинайте если код вас режет глаза. Я только сегодня ознакомился с PyQt

Ну как же тебя не пинать если ты с PyQt познакомился, а с дизайнером нет.
balalay12
Дизайнера нет, потому что в задании написано “рисовать кодом”.
vic57
вангую что c ТableWidget связано
запустите в консоли
python -v my_script
больше инфы будет
сегфолт чаще всего nullpointer
Rodegast
> Дизайнера нет, потому что в задании написано “рисовать кодом”.

Ты не поверишь но дизайнер таки рисует кодом.
balalay12
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]
vic57
 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)
balalay12
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())
vic57
ну альтернативно попробуй requests, Qt - для гуя
и print понаставь чтобы данные видеть
мне кажется, неправильно кнопки так в цикле создавать - ты их нигде не удаляешь
 self.btns = []# clear buttons
for i in ...
   self.btns.append(QPushButton..)
for i in self.btns: 
    i.connect...
Rodegast
Мил-человек у тебя как минимум виджеты не принадлежат экземпляру класса, а это значит что их может скушать мусорщик что как раз и приведёт к “Ошибка сегментирования”. По этому ты зря меня не слушаешь.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB