iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
Python

pythonGUI學習筆記系列 第 20

Day 20 PySide6 線程(QThread)

  • 分享至 

  • xImage
  •  

QThread

  • 多執行緒 : 在開發介面時,主線程負責處理用戶的交互和事件。如果我們在主線程中,使用了耗時的操作例如文件讀寫,介面會戰時卡住,沒辦法互動。要想解決這問題,就可以用多執行緒,將任務放到執行緒中,來保持順暢,讓用戶可以繼續與介面交互。

使用 QThread

首先,創建一個類繼承 QThread,並在 run() 方法中定義執行的功能。接著,在窗口中創建線程實例,並使用 start() 來啟動線程,這樣耗時操作將在背景中執行,而不會阻塞主線程。

from PySide6.QtWidgets import QApplication , QWidget
from PySide6.QtCore import QThread
import time

class MyThread(QThread):
    def run(self):
        for i in range(5):
            print(f"計數: {i}")
            time.sleep(1)  # 模擬耗時操作

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()

        # 創建並啟動線程
        self.thread = MyThread()
        self.thread.start()

if __name__ == "__main__":
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec()

QThread 常用的信號

  • started.connect(function) : 當線程啟動時觸發,執行指定的函數或操作。
  • finished.connect(function) : 當線程執行完成後觸發,通常與 deleteLater() 搭配使用,用來在任務完成後安全地刪除線程對象,釋放資源。deleteLater() 是用於延遲刪除 Qt 對象的方法,保證在下次事件循環時安全地釋放內存。

QThread 使用範例

範例使用 QThread 在後台進行計數操作,並通過自訂信號,更新標籤文字。同時,在開始與結束時信號觸發顯示文字。

import time
from PySide6.QtWidgets import QMainWindow , QApplication, QWidget , QLabel
from PySide6.QtCore import QThread , Signal

class Work(QThread) :
    #自訂信號
    update_lb = Signal(str)

    def run(self):
        for i in range(1,6):
            time.sleep(1)
            self.update_lb.emit(f"計數: {i}")

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(50,50)
        # 設定標籤
        self.lb = QLabel("尚未開始",self)
        self.lb.setGeometry(0,0,50,50)

        #建立執行緒
        self.WorkThread = Work()
        self.WorkThread.update_lb.connect(self.lb.setText)
        self.WorkThread.start()

        #設定信號
        self.WorkThread.started.connect(lambda: print("開始執行線程"))
        self.WorkThread.finished.connect(lambda: print("線程結束了"))

if __name__ == "__main__":
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec()

總結

  • QThread 使用 : 首先建立一個類,通過繼承 QThread , 然後將需要的功能放入 run(),就可以將工作,移動到線程中執行,避免主線程卡頓。

  • QThread 常用的信號

功能 方法
開始線程時觸發 started.connect(function)
結束線程時觸發 finished.connect(function)

上一篇
Day 19: PySide6 自訂信號
下一篇
Day 21 PySide6 進度條(QProgress)
系列文
pythonGUI學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言