1. 程式人生 > >Python+PyQT5的子執行緒更新UI介面

Python+PyQT5的子執行緒更新UI介面

子執行緒裡是不能更新UI介面的,在移動端方面。Android的UI訪問是沒有加鎖的,多個執行緒可以同時訪問更新操作同一個UI控制元件。也就是說訪問UI的時候,android系統當中的控制元件都不是執行緒安全的,這將導致在多執行緒模式下,當多個執行緒共同訪問更新操作同一個UI控制元件時容易發生不可控的錯誤。所以Android中規定只能在UI執行緒中訪問UI,相當於從另一個角度給Android的UI訪問加上鎖,一個偽鎖。

在PyQT5中使用QThread

from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import time

#繼承QThread

class Mythread(QThread):
    # 定義訊號,定義引數為str型別
    breakSignal = pyqtSignal(int)

    def __init__(self, parent=None):
        super().__init__(parent)
        # 下面的初始化方法都可以,有的python版本不支援
        #  super(Mythread, self).__init__()

    def run(self):
            #要定義的行為,比如開始一個活動什麼的

            for i in(1,1000):

                print(i)
                self.breakSignal.emit(i)
            


if __name__ == '__main__':
    app = QApplication([])
    dlg = QDialog()
    dlg.resize(400, 300)
    dlg.setWindowTitle("自定義按鈕測試")
    dlgLayout = QVBoxLayout()
    dlgLayout.setContentsMargins(40, 40, 40, 40)
    btn = QPushButton('測試按鈕')
    dlgLayout.addWidget(btn)
    dlgLayout.addStretch(40)
    dlg.setLayout(dlgLayout)
    dlg.show()


    def chuli(a):
        # dlg.setWindowTitle(s)
        btn.setText(str(a))

    # 建立執行緒
    thread = Mythread()
    # # 註冊訊號處理函式
    thread.breakSignal.connect(chuli)
    # # 啟動執行緒
    thread.start()
    dlg.exec_()
    app.exit()

在python中重新整理UI可以類似,採用訊息傳遞的機制。

可以在子執行緒中修改主執行緒的變數,主執行緒讀取變數並繪製的方式。