Python+PyQT5的子執行緒更新UI介面
阿新 • • 發佈:2019-01-08
子執行緒裡是不能更新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可以類似,採用訊息傳遞的機制。
可以在子執行緒中修改主執行緒的變數,主執行緒讀取變數並繪製的方式。