Python 開發GUI之 多線程的實現


圖形界面,大多會采用多線程來更新一些耗時的程序。以達到軟件的流暢性使用。

多線程的實現主要有以下幾種方法:

【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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM