一起使用 psycopg2 和 Qthreads(或仅使用 postgresql 和 qthreads)并更新 GUI [英] Using psycopg2 and Qthreads together(or just postgresql and qthreads) and updating GUI

查看:68
本文介绍了一起使用 psycopg2 和 Qthreads(或仅使用 postgresql 和 qthreads)并更新 GUI的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

DB 中的订单簿始终显示正确的订单簿,我只想在 GUI 中不断更新它.我一直在尝试让它工作,但是当我尝试运行 cur 语句时,应用程序崩溃了.我怀疑我需要一些帮助来不必每次都清除 tableelement,而只更新已更改的项目(我假设这是一件聪明的事情,但我不确定).如果我必须使用 Qt 的 postgresql 库,我会,但是你必须帮助我如何运行它:)

The orderbook in DB always shows the right orderbook, i just want to continually update it in a GUI. I've been trying to get this to work but when i try to run a cur statement the app just crashes. I suspect i need some help to not have to clear the tableelement each time too, but only update items that have changed(i'm assuming this is a smart thing but im not sure). If i have to use Qt's postgresql lib i will, but then you have to help me how to get that running :)

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import pyqtSignal, QThread
import psycopg2
import sys
import time
conn = psycopg2.connect("dbname=myDb user=kris")
cur = conn.cursor()

class Ui_MainWindow(QThread):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(50, 50, 711, 481))
        self.tableWidget.setRowCount(3)
        self.tableWidget.setColumnCount(4)
        self.tableWidget.setHorizontalHeaderLabels(['Sum', 'Total', 'Size', 'Bid'])
        self.tableWidget.setObjectName("tableWidget")
        self.btnBuy = QtWidgets.QPushButton(self.centralwidget)
        self.btnBuy.setGeometry(QtCore.QRect(50, 10, 91, 33))
        self.btnBuy.setObjectName("btnBuy")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 29))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.btnBuy.setText(_translate("MainWindow", "BUY"))


class MainUIClass(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__()
        self.setupUi(self)
        self.threadclass = ThreadClass()
        self.threadclass.start()
        self.threadclass.updateTable.connect(self.updateTable)

    def updateTable(self, val):
        print(val)
        if 'setRowCount' in val:
            self.tableWidget.setRowCount(val['setRowCount'])
        elif 'insertRow' in val:
            self.tableWidget.insertRow(val['insertRow'])
        elif 'setItem' in val:
            rowNum = val['setItem'][0]
            colNum = val['setItem'][1]
            data = val['setItem'][2]
            self.tableWidget.setItem(rowNum, colNum+2,     QtWidgets.QTableWidgetItem(str(data)))

class ThreadClass(QtCore.QThread):
    updateTable = pyqtSignal(dict)

    def __init__(self, parent=None):
        super().__init__()

    def run(self):
        cur.execute("select quantity, rate from orderbook where type = %s and market = %s order by rate asc limit 10;", (0, "BTC-ADA"))
        orderbook = cur.fetchall()
        conn.commit()
        for rowNum, rowData in enumerate(orderbook):
            self.updateTable.emit({"insertRow": 0})
            for colNum, data in enumerate(rowData):
                self.updateTable.emit({"setItem": [rowNum, colNum, data]})

if __name__ == "__main__":
    a = QtWidgets.QApplication(sys.argv)
    app = MainUIClass()
    app.show()
    #a.exec_()

    cur.close()
    conn.close()
    sys.exit(a.exec_())

推荐答案

您在 Qt 的主循环开始之前关闭了数据库连接,将所有与 Postgres 相关的内容移动到线程中.

You are closing the database connection before Qt's main loop is started, move all Postgres related stuff into the thread.

class ThreadClass(QtCore.QThread):
    updateTable = pyqtSignal(dict)

    def __init__(self, parent=None):
        super().__init__()

    def run(self):
        conn = psycopg2.connect("dbname=motocompano_dev user=pg_admin password=pGsql_#--w3N_a0X!s7J-o1U+ host=localhost port=5555")

        cur = conn.cursor()        
        cur.execute("select * from events")
        orderbook = cur.fetchall()

        for rowNum, rowData in enumerate(orderbook):
            self.updateTable.emit({"insertRow": 0})
            for colNum, data in enumerate(rowData):
                self.updateTable.emit({"setItem": [rowNum, colNum, data]})

        cur.close()
        conn.close()

这篇关于一起使用 psycopg2 和 Qthreads(或仅使用 postgresql 和 qthreads)并更新 GUI的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆