PyQt5事件處理之定時在控制元件上顯示資訊的程式碼
阿新 • • 發佈:2020-03-26
有時候為了體現延時效果,或者是多事件處理,需要在視窗的文字編輯框或者表格等控制元件中,延遲幾秒或每隔幾秒顯示輸出一段資料,又或者可以說是每隔幾秒執行下一行程式碼!要實現這種效果,關鍵的兩個方法就是time.sleep()
與processEvents(),
具體看如下程式碼:
from PyQt5 import QtCore,QtGui,QtWidgets import sys from PyQt5.QtWidgets import * import time class Ui_MainWindow(object): def setupUi(self,MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(390,500) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout_2.setObjectName("gridLayout_2") self.gridLayout = QtWidgets.QGridLayout() self.gridLayout.setObjectName("gridLayout") self.textEdit = QtWidgets.QTextEdit(self.centralwidget) self.textEdit.setObjectName("textEdit") self.gridLayout.addWidget(self.textEdit,1,1) self.tableWidget = QtWidgets.QTableWidget(self.centralwidget) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setColumnCount(3) self.tableWidget.setRowCount(4) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(0,item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(1,item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(2,item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(3,item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(0,item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(1,item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setHorizontalHeaderItem(2,item) self.gridLayout.addWidget(self.tableWidget,1) self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setMaximumSize(QtCore.QSize(200,16777215)) self.pushButton.setObjectName("pushButton") self.gridLayout.addWidget(self.pushButton,2,1) self.gridLayout_2.addLayout(self.gridLayout,1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0,800,18)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) # 表格屬性設定 self.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) # 【開始】按鈕 self.pushButton.clicked.connect(self.pushButton_Clicked) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) # 設定每隔幾秒輸出資料 def pushButton_Clicked(self): self.textEdit.setText("獲取基金資料中...") # 重新整理頁面 QApplication.processEvents() item = [["110003","易方達上證50","-1.97%"],["005918","天弘滬深300","-3.15%"],["001513","易方達資訊產業","-4.69%"]] for i in range(3): # 每隔兩秒執行一次以下程式碼,直到迴圈結束 time.sleep(2) self.textEdit.append("獲取基金" + item[i][1] + "\n...") for j in range(3): self.tableWidget.setItem(i,j,QtWidgets.QTableWidgetItem(item[i][j])) # 重新整理頁面 QtWidgets.QApplication.processEvents() def retranslateUi(self,MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow","MainWindow")) item = self.tableWidget.verticalHeaderItem(0) item.setText(_translate("MainWindow","1")) item = self.tableWidget.verticalHeaderItem(1) item.setText(_translate("MainWindow","2")) item = self.tableWidget.verticalHeaderItem(2) item.setText(_translate("MainWindow","3")) item = self.tableWidget.verticalHeaderItem(3) item.setText(_translate("MainWindow","4")) item = self.tableWidget.horizontalHeaderItem(0) item.setText(_translate("MainWindow","基金編號")) item = self.tableWidget.horizontalHeaderItem(1) item.setText(_translate("MainWindow","基金名稱")) item = self.tableWidget.horizontalHeaderItem(2) item.setText(_translate("MainWindow","基金淨值")) self.pushButton.setText(_translate("MainWindow","開始")) if __name__ == "__main__": app = QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
其中關鍵程式碼如下,需要設計一個迴圈才能實現每隔2秒執行一次迴圈中的程式碼,至於為何要呼叫兩次重新整理頁面的函式,是因為每呼叫一次QApplication.processEvents()
就會重新整理頁面,將之前在視窗顯示資料的程式碼的效果全部顯示到視窗中,而在迴圈之前有一個輸出到文字框的文字需要首先顯示,所以在迴圈之前重新整理一次頁面,否則就會和迴圈第一次的內容一起出現!而第二次呼叫這個函式則是將迴圈中每隔2秒執行的那幾行程式碼產生的效果顯示出來,其中輸出文字框採用append()
是為了不覆蓋之前的文字。
# 設定每隔幾秒輸出資料 def pushButton_Clicked(self): self.textEdit.setText("獲取基金資料中...") # 重新整理頁面 QApplication.processEvents() item = [["110003",QtWidgets.QTableWidgetItem(item[i][j])) # 重新整理頁面 QtWidgets.QApplication.processEvents()
執行結果如下圖所示(內容以基金的淨值為例,以此紀念我這段艱難入坑基金的歲月,嗚嗚嗚,跌穿谷底嚕):因為不是動圖,實際顯示的效果是:點選【開始】按鈕後,首先文字框顯示第一行文字,然後隔2秒後顯示第二三行文字,同時在表格中顯示第一行的資訊,再隔2秒就是文字框第四五行文字以及表格第二行資訊,以此類推,直到迴圈結束!
雖然PyQt5中有自己的定時器QTimer,但是我暫時沒有想到如何用它來實現上述的效果,因此就沒有使用該方法,如有更好的方法歡迎大神指點!
總結
到此這篇關於PyQt5事件處理之定時在控制元件上顯示資訊的程式碼的文章就介紹到這了,更多相關PyQt5事件處理內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!