PyQt5事件處理之定時在控件上顯示信息的代碼
有時候為了體現(xiàn)延時效果,或者是多事件處理,需要在窗口的文本編輯框或者表格等控件中,延遲幾秒或每隔幾秒顯示輸出一段數(shù)據(jù),又或者可以說是每隔幾秒執(zhí)行下一行代碼!要實現(xiàn)這種效果,關(guān)鍵的兩個方法就是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, 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, 0, 1, 1, 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, 1, 1) self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 18)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) # 表格屬性設(shè)置 self.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) # 【開始】按鈕 self.pushButton.clicked.connect(self.pushButton_Clicked) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) # 設(shè)置每隔幾秒輸出數(shù)據(jù) def pushButton_Clicked(self): self.textEdit.setText("獲取基金數(shù)據(jù)中...") # 刷新頁面 QApplication.processEvents() item = [["110003", "易方達上證50", "-1.97%"], ["005918", "天弘滬深300", "-3.15%"], ["001513", "易方達信息產(chǎn)業(yè)", "-4.69%"]] for i in range(3): # 每隔兩秒執(zhí)行一次以下代碼,直到循環(huán)結(jié)束 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_())
其中關(guān)鍵代碼如下,需要設(shè)計一個循環(huán)才能實現(xiàn)每隔2秒執(zhí)行一次循環(huán)中的代碼,至于為何要調(diào)用兩次刷新頁面的函數(shù),是因為每調(diào)用一次QApplication.processEvents()
就會刷新頁面,將之前在窗口顯示數(shù)據(jù)的代碼的效果全部顯示到窗口中,而在循環(huán)之前有一個輸出到文本框的文字需要首先顯示,所以在循環(huán)之前刷新一次頁面,否則就會和循環(huán)第一次的內(nèi)容一起出現(xiàn)!而第二次調(diào)用這個函數(shù)則是將循環(huán)中每隔2秒執(zhí)行的那幾行代碼產(chǎn)生的效果顯示出來,其中輸出文本框采用append()
是為了不覆蓋之前的文字。
# 設(shè)置每隔幾秒輸出數(shù)據(jù) def pushButton_Clicked(self): self.textEdit.setText("獲取基金數(shù)據(jù)中...") # 刷新頁面 QApplication.processEvents() item = [["110003", "易方達上證50", "-1.97%"], ["005918", "天弘滬深300", "-3.15%"], ["001513", "易方達信息產(chǎn)業(yè)", "-4.69%"]] for i in range(3): # 每隔兩秒執(zhí)行一次以下代碼,直到循環(huán)結(jié)束 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()
運行結(jié)果如下圖所示(內(nèi)容以基金的凈值為例,以此紀(jì)念我這段艱難入坑基金的歲月,嗚嗚嗚,跌穿谷底嚕):因為不是動圖,實際顯示的效果是:點擊【開始】按鈕后,首先文本框顯示第一行文字,然后隔2秒后顯示第二三行文字,同時在表格中顯示第一行的信息,再隔2秒就是文本框第四五行文字以及表格第二行信息,以此類推,直到循環(huán)結(jié)束!
雖然PyQt5中有自己的定時器QTimer,但是我暫時沒有想到如何用它來實現(xiàn)上述的效果,因此就沒有使用該方法,如有更好的方法歡迎大神指點!
總結(jié)
到此這篇關(guān)于PyQt5事件處理之定時在控件上顯示信息的代碼的文章就介紹到這了,更多相關(guān)PyQt5事件處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)計算兩個指定日期相差幾年幾月幾日
這篇文章主要為大家詳細(xì)介紹了如何使用Python實現(xiàn)計算兩個日期之間相差多少年,多少月,多少天,文中的的示例代碼講解詳細(xì),需要的可以參考下2024-02-02Python中Timedelta轉(zhuǎn)換為Int或Float方式
這篇文章主要介紹了Python中Timedelta轉(zhuǎn)換為Int或Float方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07OpenCV中resize函數(shù)插值算法的實現(xiàn)過程(五種)
最新版OpenCV2.4.7中,cv::resize函數(shù)有五種插值算法:最近鄰、雙線性、雙三次、基于像素區(qū)域關(guān)系、蘭索斯插值。感興趣的可以了解一下2021-06-06詳解Python中的數(shù)據(jù)清洗工具flashtext
FlashText是GitHub上的一個開源Python庫,正如之前所提到的,它在提取關(guān)鍵字和替換關(guān)鍵字任務(wù)上有著極高的性能。本文將詳解一下flashtext的使用,需要的可以參考一下2022-06-06