0
DB의 주문 서적에는 항상 올바른 주문 도서가 표시되므로 계속 GUI에서 계속 업데이트하고 싶습니다. 이 작업을 얻으려고 노력했지만 cur 문을 실행하려고하면 응용 프로그램이 충돌합니다. 나는 내가 tableelement를 지울 필요가 없도록 약간의 도움이 필요하다고 생각하지만, 변경된 항목 만 업데이트한다 (나는 똑똑한 것이지만 확실하지 않다). 나는 것입니다 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_())
아, 실제로 작동했습니다. 문서를 읽은 후 시도해 보았고 끝없이 "최상의"해결책을 찾으려고 노력했습니다 ... 어쨌든. 이게 내가 떠나는 것이 열 번째 열의 데이터 일뿐입니다 ... – n00p
Ok! 그 일 했어. 다음 루프는 분명히 다른 루프 내부에서 루핑 되었기 때문에 "old"rowNum을 사용했습니다. 내가 새 값만 업데이트 할 수있는 방법을 알고 있습니까? 아니면 매번 테이블을 지우고 새 값을 입력해야합니까? – n00p
나는 게으른 방법을 선호합니다 : 테이블을 지우고 모든 것을 다시로드하십시오 :) –