PyQt5和Python的多執行緒

2021-09-14 01:35:53 字數 1840 閱讀 9065

python程式本身沒有真正意義的併發多執行緒,受制於gil鎖。如果實現真正的多執行緒,需要借助於多程序實現,類unix平台都提供了fork系統呼叫,但是windows平台很難實現多程序。

多程序消耗資源比較大,有些情況下,一些輕量級的任務需要借助多程序,比如高i/o、輕計算的任務。threading庫是python封裝的高階執行緒庫。但是,如果是使用pyqt5的ui情況下,更建議使用qthread子執行緒,因為內部就有訊號和槽機制。

from pyqt5.qtcore import qthread

class

mythread

(qthread)

:def

__init__

(self)

:super

(mythread, self)

.__init__(

)def

run(self)

:"""

在這裡執行子執行緒的操作

"""pass

import time

from pyqt5.qtcore import

*class

mythread

(qthread)

: sig = pyqtsignal(

int)

def__init__

(self, parent=

none):

super

(mythread, self)

.__init__(parent)

defrun

(self)

: n =

0while

true

: self.sig.emit(n)

print

("run"

) time.sleep(

0.3)

n +=

1class

main

(qobject)

:def

__init__

(self, parent=

none):

super

(main, self)

.__init__(parent)

self._thread = mythread(

) self._thread.sig.connect(self.outtext)

self._thread.start(

)def

outtext

(self, n)

:print

(n)# 這裡進入qt自身的事件迴圈機制

)main = main(

))

之前有一種錯誤的寫法,是在myclass新增乙個死迴圈,即類中還有乙個函式:

def

work

(self)

:while

true

: time.sleep(

0.1)

print

("work"

)

然後再主迴圈中呼叫:

main = main(

)main.work(

)

這樣,你會發現永遠不會有數字輸出,即outtext函式永遠不會被呼叫。因為訊號處理是在qt自身的訊號迴圈中處理的,而work的死迴圈導致永遠無法進入事件迴圈機制,所以無法進行處理!!!

pyqt5切換python版本 pyqt5介面切換

主要的思路就是建立兩個frame 如果有兩個以上同理 使用setvisible 函式顯示或者隱藏frame 引數是bool值 import sys from pyqt5.qtwidgets import from pyqt5.qtcore import from pyqt5.qtgui import...

pyqt和python的關係 PyQt5 簡介

本教程的目的是帶領你入門pyqt5。教程內所有 都在linux上測試通過。pyqt4 教程是pyqt4的教程,pyqt4是乙個python 同時支援2和3 版的qt庫。關於 pyqt5 pyqt5 是digia的一套qt5應用框架與python的結合,同時支援2.x和3.x。本教程使用的是3.x。q...

學習PyQt5(三) PyQt5的訊號和槽

我 如圖所示,我們建立乙個按鈕及乙個瀏覽器。什麼是訊號?比如按鈕的單擊,雙擊,按下,釋放等,都可以認為是乙個訊號 什麼是槽?對應的訊號,做出什麼應對,這要乙個應對在乙個函式中,我們可以認為這就是乙個訊號 槽關係 在qt designer中點選工具欄 注意不是工具盒 中的這個圖示 點選這個圖示後,就進...