圖形界面,大多會采用多線程來更新一些耗時的程序。以達到軟件的流暢性使用。
多線程的實現主要有以下幾種方法:
【timer】
1、通過timer.timeout() 方法來實現
在timeout后調用對應的觸發函數:
下面我們簡單編寫一個小例子:(timeout)
ui建立兩個按鈕
代碼實例:
# 引用庫所需要的文件 from PySide2.QtCore import QTimer timer = QTimer() #定義信號的觸發函數 XXX.pushButtonTimestart.clicked.connect(timestart) XXX.pushButtonTimestop.clicked.connect(timestop) XXXr.timeout.connect(timeout) # 定義槽函數 def timestart(): timer.start(1) def timestop(): timer.stop() def timeout(): print('time out')
timer的另外一個實例:調用靜態方法
QTimer.singleShot()
需要知道該方法無需信號與槽的機制,直運行一次
代碼實例:
from PySide2.QtCore import QTimer timerSingleShot = QTimer 定時500ms timerSingleShot.singleShot(500,singleShotFun) # 時間到達后的觸發函數 def singleShotFun(): print("this timer has stopped")
【QThread】線程
主要的思路是我們先建立一個進程的類,然后在其中寫入我們想要實現的方法函數,當需要切入進程時就可以調用。
# 引用庫 from PySide2.QtWidgets import QMessageBox from PySide2.QtCore import QTimer, QThread, Signal # 定義變量 計數 global sec sec = 0 # 定義工作線程類 class WorkThread(QThread): timer = Signal() # 每隔一秒發送一段計數 end = Signal() # 計數完成后發送此信號 # 可以在此處初始化
def __init__(self):
super(WorkThread,self).__init__()
print('WorkThread 初始化完成!')
# 進程的內容用 run() 固定使用 def run(self): while True: self.sleep(1) if sec == 5: self.end.emit() # 發送end 信號 break self.timer.emit() # 發送 timer信號 # 生成一個新的類 workthread = WorkThread() # 定義信號函數與槽 workthread.timer.connect(countTimer) workthread.end.connect(endMessage) uis.pushButton.clicked.connect(work) # 定義槽函數 def countTimer(): global sec sec += 1 print('觸發'+ str(sec) + '次') def endMessage(): QMessageBox.critical( QMainWindow(), '警告', '計數已經到達!') def work(): # 開始進程用start() 固定用法 workthread.start()
【子線程模板】
模板1:(Python中自帶的線程)
# 線程切換模板函數 from threading import Thread # 參數 arg1 = 1 arg2 = 2 # 定義線程入口函數 def threadFunction(Parg1, Parg2): print(Parg1 + Parg2) # 調用線程 入口函數 + 傳入參數 thread = Thread(target=threadFunction, args=(arg1, arg2) ) thread.start()
模板2:(使用QT中的線程)
# 線程切換模板函數 from threading import Thread from PySide2.QtCore import QThread, Signal # 參數 arg1 = 1 arg2 = 2 # 定義線程入口函數 def threadFunction(Parg1, Parg2): print(Parg1 + Parg2) # 調用線程 入口函數 + 傳入參數 class thread(QThread): global arg1, arg2 def run(Parg1, Parg2): threadFunction(Parg1, Parg2) thread.run(arg1, arg2) #
模板3:
# 模板3 使用QT中的線程 from PySide2.QtCore import QThread, Signal breakFlag = True class WorkThread(QThread): signal1 = Signal() # 信號1 的定義 signal2 = Signal() # 信號2 的定義 # 可以在此處初始化 def __init__(self): super(WorkThread, self).__init__() print('WorkThread 初始化完成!') # 線程的入口函數 def run(self): global breakFlag while True: self.sleep(1) # 掃描的時間 單位:秒 if breakFlag == True: self.signal1.emit() # 發送end 信號 break else: self.signal2.emit() # 發送 timer信號 workthread = WorkThread() # 信號觸發函數 workthread.signal1.connect(fun1) workthread.signal2.connect(fun2) # 進程啟動信號函數 pushButton.clicked.connect(work) # 信號1 觸發槽函數 def fun1(): pass # 信號2 觸發槽函數 def fun2(): pass # 進程啟動函數 def work(): workthread.start() # 注意:進程啟動默認使用 start()