子線程里是不能更新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可以類似,采用消息傳遞的機制。
可以在子線程中修改主線程的變量,主線程讀取變量并繪制的方式。
以上這篇Python+PyQT5的子線程更新UI界面的實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
