Python+PyQT5的子線程更新UI界面的實例

子線程裏是不能更新UI界面的,在移動端方面。Android的UI訪問是沒有加鎖的,多個線程能夠同時訪問更新操做同一個UI控件。也就是說訪問UI的時候,android系統當中的控件都不是線程安全的,這將致使在多線程模式常見問題下,當多個線程共同訪問更新操做同一個UI控件時容易發生不可控的錯誤。因此Android中規定只能在UI線程中訪問UI,至關於從另外一個角度給Android的UI訪問加上鎖,一個僞鎖。python

在PyQT5中使用QThreadandroid

from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication安全

from PyQt5.QtWidgets import *多線程

from PyQt5.QtCore import *app

import timeide

#繼承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能夠相似,採用消息傳遞的機制。

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

相關文章
相關標籤/搜索