2017-12-16 13 views
0

DBの注文簿には常に正しい注文簿が表示されているので、GUIで継続的に更新したいだけです。私はこれが動作するようにしようとしてきましたが、私はcurステートメントを実行しようとすると、アプリがちょうどクラッシュします。私はテーブルアイテムをクリアする必要がないようにするためにいくつかの助けが必要だと思うが、変更されたアイテムだけを更新する(私はこれがスマートなものだと思っているが、わからない)。私は意志QtのPostgreSQLのlibが使用する必要がありますが、あなたが実行している:)psycopg2とQthreadsを併用する(または単にpostgresqlとqthreads)GUIを更新する

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_()) 

答えて

1

をQtのメインループが開始される前に、データベース接続を閉じているが、すべてのPostgres関連のものを移動することを取得する方法を私を助けるために持っている場合スレッドに挿入します。

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() 
+0

実際にはうまくいきました。ドキュメントを読んだ後でそれを試して、代わりに無限に "最高の"解決策を見つけようとしました...とにかく。これが私に残すのは、10行目のデータだけです... – n00p

+0

それは働いている。次のループは、他のループの内部でループしていたため、明らかに "古い" rowNumを使用していました。どのように私は新しい値を更新することができますか、または私は毎回テーブルをクリアして新しい値を入れる必要があります知っていますか? – n00p

+0

私は怠惰な方法を好む:テーブルをクリアし、すべてをリロード:) –

関連する問題