日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Python Qt GUI设计:QTimer计时器类、QThread多线程类和事件处理类(基础篇—8)

發布時間:2023/11/27 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python Qt GUI设计:QTimer计时器类、QThread多线程类和事件处理类(基础篇—8) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1、QTimer計時器類

2、QThread多線程類

3、事件處理類


一般情況下,應用程序都是單線程運行的,但是對于GUI程序來說,單線程有時候滿足不了需求。例如,如果需要執行一個特別耗時的操作,在執行過程中整個程序就會卡頓,效果就非常不理想或者Windows系統也認為程序運行出錯,自動關閉了程序。要解決這種問題就涉及多線程的知識。

一般來說,多線程技術涉及三種方法,其中第一種是使用計時器模塊QTimer;第二種是使用多線程模塊QThread;最后是使用事件處理的功能。

1、QTimer計時器類

如果要在應用程序中周期性地進行某項操作,比如周期性地檢測主機的CPU值,則需要用到QTimer(定時器),QTimer類提供了重復的和單次的定時器。要使用定時器,需要先創建一個QTimer實例,將其timeout信號連接到相應的槽,并調用start()。然后,定時器會以恒定的間隔發出timeout信號。

當窗口控件收到timeout信號后,它就會停止這個定時器。這是在圖形用戶界面中實現復雜工作的一個典型方法,隨著技術的進步,多線程在越來越多的平臺上被使用,最終QTimer對象會被線程所替代。

QTimer類中的常用方法如下表所示:

QTimer類中的常用信號如下表所示:?

通過一個示例,了解QTimer計時器類的使用方法,效果如下所示:

示例中,初始化一個定時器,把定時器的timeout信號與showTime()槽函數連接起來。使用連接的槽函數顯示當前時間,并在標簽上顯示系統現在的時間。單擊“開始"按鈕,啟動定時器,并使"開始"按鈕失效。單擊“結束"按鈕,停止定時器,并使“結束"按鈕失效。

實現代碼如下所示:

from PyQt5.QtWidgets import QWidget,  QPushButton ,  QApplication ,QListWidget,  QGridLayout , QLabel
from PyQt5.QtCore import QTimer ,QDateTime
import sys class WinForm(QWidget):  def __init__(self,parent=None): super(WinForm,self).__init__(parent) self.setWindowTitle("QTimer demo")self.listFile= QListWidget() self.label = QLabel('顯示當前時間')self.startBtn = QPushButton('開始') self.endBtn = QPushButton('結束') layout = QGridLayout(self) # 初始化一個定時器self.timer = QTimer(self)# showTime()方法self.timer.timeout.connect(self.showTime)layout.addWidget(self.label,0,0,1,2)   layout.addWidget(self.startBtn,1,0) layout.addWidget(self.endBtn,1,1) 		self.startBtn.clicked.connect( self.startTimer) self.endBtn.clicked.connect( self.endTimer) self.setLayout(layout)   def showTime(self): # 獲取系統現在的時間time = QDateTime.currentDateTime() # 設置系統時間顯示格式timeDisplay = time.toString("yyyy-MM-dd hh:mm:ss dddd");# 在標簽上顯示時間self.label.setText( timeDisplay ) def startTimer(self): # 設置計時間隔并啟動self.timer.start(1000)self.startBtn.setEnabled(False)self.endBtn.setEnabled(True)def endTimer(self): self.timer.stop()self.startBtn.setEnabled(True)self.endBtn.setEnabled(False)if __name__ == "__main__":  app = QApplication(sys.argv)  form = WinForm()  form.show()  sys.exit(app.exec_())

2、QThread多線程類

QThread是Qt線程類中最核心的底層類,由于PyQt的跨平臺特性,QThread要隱藏所有與平臺相關的代碼。

在使用線程時可以直接得到Thread實例,調用其start()函數即可啟動線程。線程啟動之后,會自動調用其實現的run方法,該方法就是線程的執行函數。

業務的線程任務就寫在run()函數中,當run()退出之后線程基本就結束了。QThread有started和finished信號,可以為這兩個信號指定槽函數,在線程啟動和結束時執行一段代碼進行資源的初始化和釋放操作。更靈活的使用方法是,在自定義的QThread實例中自定義信號,并將信號連接到指定的槽函數,當滿足一定的業務條件后發射此信號。

QThread類中的常用方法如下表所示:

QThread類中的常用信號如下表所示:?

通過一個示例,了解QThread多線程類的使用方法,效果如下所示:

示例中,在主界面中有一個用于顯示時間的LCD數字面板,還有一個用于啟動任務的按鈕。用戶單擊"測試"按鈕后,將開始一次非常耗時的計算(在程序中用一個2000 000 000次的循環來模擬這次非常耗時的工作,在真實的程序中可能是一個網絡下載操作,從網絡上下載一個很大的視頻文件),同時LCD數字面板開始顯示所用的毫秒數,并通過一個計時器進行更新。但是單擊”測試“按鈕后可見窗口卡死無法操作。此時在PyQt中所有的窗口都在UI主線程中(就是執行了QApplication.exec()的線程),在這個線程中執行耗時的操作會阻塞UI線程,從而讓窗口停止響應。如果窗口長時間沒有響應,則會影響用戶體驗,更嚴重的會導致程序崩潰。所以,為了避免出現這樣的問題,要使用QThread開啟一個新的線程,在這個線程中完成耗時的操作。

實現代碼如下所示:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *global sec
sec=0class WorkThread(QThread):trigger = pyqtSignal()def __int__(self):super(WorkThread,self).__init__()def run(self):for i in range(2000000000):pass# 循環完畢后發出信號		self.trigger.emit()        def countTime():global  secsec += 1# LED顯示數字+1lcdNumber.display(sec)          def work():# 計時器每秒計數timer.start(1000)   # 計時開始	workThread.start()       # 當獲得循環完畢的信號時,停止計數	workThread.trigger.connect(timeStop)  def timeStop():timer.stop()print("運行結束用時",lcdNumber.value())global secsec=0if __name__ == "__main__":  	app = QApplication(sys.argv) top = QWidget()top.resize(300,120)# 垂直布局類QVBoxLayoutlayout = QVBoxLayout(top) # 加個顯示屏    lcdNumber = QLCDNumber()             layout.addWidget(lcdNumber)button = QPushButton("測試")layout.addWidget(button)timer = QTimer()workThread = WorkThread()button.clicked.connect(work)# 每次計時結束,觸發 countTimetimer.timeout.connect(countTime)      top.show()sys.exit(app.exec_())

3、事件處理類

PyQt為事件處理提供了兩種機制:高級的信號與槽機制以及低級的事件處理程序。本篇文博只介紹低級的事件處理程序即:processEvents()函數的使用方法,它的作用是處理事件,簡單地說,就是刷新頁面。

對于執行很耗時的程序來說,由于PyQt需要等待程序執行完畢才能進行下一步,這個過程表現在界面上就是卡頓。而如果在執行這個耗時程序時不斷地運行
QApplication.processEvents(),那么就可以實現一邊執行耗時程序,一邊刷新頁面的功能,給人的感覺就是程序運行很流暢。

因此QApplication.processEvents()的使用方法就是,在主函數執行耗時操作的地方,加入QApplication.processEvents()。

通過一個示例,了解事件處理類的使用方法,效果如下所示:

實現代碼如下所示:

from PyQt5.QtWidgets import QWidget,  QPushButton ,  QApplication ,QListWidget,  QGridLayout 
import sys 
import timeclass WinForm(QWidget):  def __init__(self,parent=None): super(WinForm,self).__init__(parent) self.setWindowTitle("實時刷新界面例子")        self.listFile= QListWidget() self.btnStart = QPushButton('開始') layout = QGridLayout(self) layout.addWidget(self.listFile,0,0,1,2) layout.addWidget(self.btnStart,1,1) self.btnStart.clicked.connect( self.slotAdd) self.setLayout(layout)   def slotAdd(self): for n in range(10): str_n='File index {0}'.format(n) self.listFile.addItem(str_n) QApplication.processEvents() time.sleep(1) if __name__ == "__main__":  app = QApplication(sys.argv)  form = WinForm()  form.show()  sys.exit(app.exec_())

總結

以上是生活随笔為你收集整理的Python Qt GUI设计:QTimer计时器类、QThread多线程类和事件处理类(基础篇—8)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。