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可以類似,採用消息傳遞的機制。

可以在子線程中修改主線程的變量,主線程讀取變量並繪製的方式。

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章