子線程里是不能更新ui界面的,在移動端方面。android的ui訪問是沒有加鎖的,多個線程可以同時訪問更新操作同一個ui控件。也就是說訪問ui的時候,android系統當中的控件都不是線程安全的,這將導致在多線程模式下,當多個線程共同訪問更新操作同一個ui控件時容易發生不可控的錯誤。所以android中規定只能在ui線程中訪問ui,相當于從另一個角度給android的ui訪問加上鎖,一個偽鎖。
在pyqt5中使用qthread
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
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界面的實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/qq_34696203/article/details/85051884