1. 程式人生 > >PyQt5學習筆記13----pyqt執行緒間通訊

PyQt5學習筆記13----pyqt執行緒間通訊

 訊號(singal)與槽(slot)用於物件相互通訊,訊號:當某個物件的某個事件發生時,觸發一個訊號,槽:響應指定訊號的所做的反應,其實訊號槽類似於.NET裡面的委託、事件,比如Repeater控制元件類,當行資料繫結後,觸發一個ItemDataBound事件,不管使用者使用會監聽該事件並做額外處理,其控制元件類內部都會觸發該事件,這種機制很多程度提高了類的封裝性和完整性。
  PyQt的窗體控制元件類已經有很多的內建訊號,開發者也可以新增自己的自定義訊號,訊號槽有如下特點:
    - 一個訊號可以連線到許多插槽。
    - 一個訊號也可以連線到另一個訊號。
    - 訊號引數可以是任何Python型別。

    - 一個插槽可以連線到許多訊號。
    - 連線可能會直接(即同步)或排隊(即非同步)。
    - 連線可能會跨執行緒。
    - 訊號可能會斷開

  (以上幾條特點翻譯於官方文件),接下來,我將以若干個例項,來體現以上幾個特點。

內建訊號槽的使用

  1. from PyQt5.QtWidgets import *  
  2. from PyQt5.QtCore import *  
  3. def sinTest():  
  4.     btn.setText("按鈕文字改變")  
  5. app = QApplication([])  
  6. main = QWidget()  
  7. main.resize(200,100)  
  8. btn = QPushButton("按鈕文字",main)  
  9. ##按鈕btn的內建訊號連線名為sinTest的槽
  10. btn.clicked.connect(sinTest)  
  11. main.show()  
  12. app.exec_()  

自定義訊號槽的使用

  1. class SinClass(QObject):  
  2.     ##宣告一個無引數的訊號
  3.     sin1 = pyqtSignal()  
  4.     ##宣告帶一個int型別引數的訊號
  5.     sin2 = pyqtSignal(int)  
  6.     ##宣告帶一個int和str型別引數的訊號
  7.     sin3 = pyqtSignal(int,str)  
  8.     ##宣告帶一個列表型別引數的訊號
  9.     sin4 = pyqtSignal(list)  
  10.     ##宣告帶一個字典型別引數的訊號
  11.     sin5 = pyqtSignal(dict)  
  12.     ##宣告一個多過載版本的訊號,包括了一個帶int和str型別引數的訊號,以及帶str引數的訊號
  13.     sin6 = pyqtSignal([int,str], [str])  
  14.     def __init__(self,parent=None):  
  15.         super(SinClass,self).__init__(parent)  
  16.         ##訊號連線到指定槽
  17.         self.sin1.connect(self.sin1Call)  
  18.         self.sin2.connect(self.sin2Call)  
  19.         self.sin3.connect(self.sin3Call)  
  20.         self.sin4.connect(self.sin4Call)  
  21.         self.sin5.connect(self.sin5Call)  
  22.         self.sin6[int,str].connect(self.sin6Call)  
  23.         self.sin6[str].connect(self.sin6OverLoad)  
  24.         ##訊號發射
  25.         self.sin1.emit()  
  26.         self.sin2.emit(1)  
  27.         self.sin3.emit(1,"text")  
  28.         self.sin4.emit([1,2,3,4])  
  29.         self.sin5.emit({"name":"codeio","age":"25"})  
  30.         self.sin6[int,str].emit(1,"text")  
  31.         self.sin6[str].emit("text")  
  32.     def sin1Call(self):  
  33.         print("sin1 emit")  
  34.     def sin2Call(self,val):  
  35.         print("sin2 emit,value:",val)  
  36.     def sin3Call(self,val,text):  
  37.         print("sin3 emit,value:",val,text)  
  38.     def sin4Call(self,val):  
  39.         print("sin4 emit,value:",val)  
  40.     def sin5Call(self,val):  
  41.         print("sin5 emit,value:",val)  
  42.     def sin6Call(self,val,text):  
  43.         print("sin6 emit,value:",val,text)  
  44.     def sin6OverLoad(self,val):  
  45.         print("sin6 overload emit,value:",val)  
  46. sin = SinClass()  
執行結果:
sin1 emit
sin2 emit,value: 1
sin3 emit,value: 1 text
sin4 emit,value: [1, 2, 3, 4]
sin5 emit,value: {'age': '25', 'name': 'codeio'}
sin6 emit,value: 1 text
sin6 overload emit,value: text

訊號槽N對N連線、斷開連線

  1. from PyQt5.QtWidgets import *  
  2. from PyQt5.QtCore import *  
  3. class SinClass(QObject):  
  4.     ##宣告一個無引數的訊號
  5.     sin1 = pyqtSignal()  
  6.     ##宣告帶一個int型別引數的訊號
  7.     sin2 = pyqtSignal(int)  
  8.     def __init__(self,parent=None):  
  9.         super(SinClass,self).__init__(parent)  
  10.         ##訊號sin1連線到sin1Call和sin2Call這兩個槽
  11.         self.sin1.connect(self.sin1Call)  
  12.         self.sin1.connect(self.sin2Call)  
  13.         ##訊號sin2連線到訊號sin1
  14.         self.sin2.connect(self.sin1)  
  15.         ##訊號發射
  16.         self.sin1.emit()  
  17.         self.sin2.emit(1)  
  18.         ##斷開sin1、sin2訊號與各槽的連線
  19.         self.sin1.disconnect(self.sin1Call)  
  20.         self.sin1.disconnect(self.sin2Call)  
  21.         self.sin2.disconnect(self.sin1)  
  22.         ##訊號sin1和sin2連線同一個槽sin1Call
  23.         self.sin1.connect(self.sin1Call)  
  24.         self.sin2.connect(self.sin1Call)  
  25.         ##訊號再次發射
  26.         self.sin1.emit()  
  27.         self.sin2.emit(1)  
  28.     def sin1Call(self):  
  29.         print("sin1 emit")  
  30.     def sin2Call(self):  
  31.         print("sin2 emit")  
  32. sin = SinClass()  
執行結果:
sin1 emit
sin2 emit
sin1 emit
sin2 emit
sin1 emit
sin1 emit

多執行緒訊號槽通訊

  1. from PyQt5.QtWidgets import *  
  2. from PyQt5.QtCore import *  
  3. class Main(QWidget):  
  4.     def __init__(self, parent = None):  
  5.         super(Main,self).__init__(parent)  
  6.         ##建立一個執行緒例項並設定名稱、變數、訊號槽
  7.         self.thread = MyThread()  
  8.         self.thread.setIdentity("thread1")  
  9.         self.thread.sinOut.connect(self.outText)  
  10.         self.thread.setVal(6)  
  11.     def outText(self,text):  
  12.         print(text)  
  13. class MyThread(QThread):  
  14.     sinOut = pyqtSignal(str)  
  15.     def __init__(self,parent=None):  
  16.         super(MyThread,self).__init__(parent)  
  17.         self.identity = None
  18.     def setIdentity(self,text):  
  19.         self.identity = text  
  20.     def setVal(self,val):  
  21.         self.times = int(val)  
  22.         ##執行執行緒的run方法
  23.         self.start()  
  24.     def run(self):  
  25.         whileself.times > 0and

    相關推薦

    PyQt5學習筆記13----pyqt執行通訊

     訊號(singal)與槽(slot)用於物件相互通訊,訊號:當某個物件的某個事件發生時,觸發一個訊號,槽:響應指定訊號的所做的反應,其實訊號槽類似於.NET裡面的委託、事件,比如Repeater控制元件類,當行資料繫結後,觸發一個ItemDataBound事件,不管使用者

    Java多執行學習筆記13執行通訊

    詳細程式碼見:github程式碼地址   本節內容: 1)  生產者消費者模型     多個生產者和多個消費者: 操作值假死及解決     多個生產者和多個消費者: 操作棧假死及解決 2) 通過管

    Java多執行學習筆記15之執行通訊

    詳細程式碼見:github程式碼地址   本節內容: 1)ThreadLocal類的使用     JDK文件及方法翻譯     InheritableThreadLocal的使用   5.

    Java多執行學習筆記14之執行通訊

    詳細程式碼見:github程式碼地址   本節內容: 1) 實戰 等待/通知之交叉備份 2) 方法join的使用(Jdk文件翻譯及原始碼解析)     join()及join(long)的使用和實現原理   &nbs

    Java多執行學習筆記11之執行通訊

    本文是我學習Java多執行緒以及高併發知識的第一本書的學習筆記, 書名是<<Java多執行緒程式設計核心技術>>,作者是大佬企業高階專案經理 高洪巖前輩,在此向他致敬。我將配合開發文件以及本書和其他的部落格 奉獻著的文章來學習,同時做一些簡單的總結。有

    Linux 學習筆記執行通訊的概念和執行控制函式

    1 執行緒間通訊 執行緒間無需特別的手段進行通訊,由於執行緒間能夠共享資料結構,也就是一個全域性變數能夠被兩個執行緒同一時候使用。只是要注意的是執行緒間須要做好同步,一般用mutex。執行緒間的通訊目的主要是用於執行緒同步,所以執行緒沒有像程序通訊中的用於資料交

    JUC學習筆記(2)—執行通訊

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; cla

    RT-Thread學習筆記3-執行通訊 & 定時器

    [toc] *** ## 1. 事件集的使用 單個指定事件喚醒執行緒,任意事件喚醒執行緒,多個指定事件一起喚醒執行緒。訊號量主要用於“一對一”的執行緒同步,當需要“一對多”、“多對一”、“多對多”的同步時,就需要事件集來處理了。RT-Thread中的事件集用一個32位無符號整型變數來表示,變數中的一個位代表

    Android學習筆記 三二 執行 後臺非同步任務AsyncTask

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    python學習筆記 day39 多執行的守護執行

    1. 守護執行緒 設定子執行緒為守護執行緒,則守護執行緒的程式碼會等待主執行緒程式碼執行完畢而結束: # 如果列印兩個 子執行緒執行結束,肯定是先列印的守護執行緒的,然後才是子執行緒2的,因為如果子執行緒2先打印出來,那麼主執行緒程式碼就結束了,守護執行緒也就立馬結束,不會在進行列印; # 如果只

    python學習筆記(62) 多執行

    程序是資源分配的最小單位(資料隔離),執行緒是cpu排程的最小單位,每個程序至少有一個執行緒 能直接被cpu排程的是執行緒,輕型實體 共享程序資源,可以併發執行,全域性變數在多個執行緒之間共享 使用者級執行緒,核心級執行緒,混合實現   全域性直譯器鎖 GIL:同一時刻只能有一個執行緒來訪

    學習筆記: jstack與執行狀態

    jstatck可以列印JVM內部所有執行緒 1、檢視有哪些java程序   2、檢視所有執行緒的資訊 重定向到5579.txt檔案中 jstack 5579 > 5579.txt   3、執行緒的狀態 New: 執行緒還沒有啟動 RUNNABLE:已經在JVM中

    學習筆記-python守護執行和時間延遲

    python守護執行緒和時間延遲 也許我們存在這種需求,有些執行緒是處於監聽功能的執行緒,希望其一直執行下去,直到關機,那麼對於一個程式而言,在啟動之後一個程序裡面可以存在很多個執行緒,其他執行緒先執行完成,如果存在某個執行緒需要一直執行,那麼這個程式就無法退出,此時就需要守護執行緒這種

    Java學習筆記之——多執行

    多執行緒程式設計 程式: 程序:一個程式執行就會產生一個程序 執行緒:程序的執行流程,一個程序至少有一個執行緒,稱為主執行緒 如:QQ聊著天,同時在聽音樂 一個程序可以有多個執行緒,多個執行緒共享同一個程序的資源 執行緒類:Tread 多執行緒程式設計: 方式一:繼承Thread (1)&n

    Deepin學習筆記---如何多執行下載網路檔案

    **** 命令列下載網路檔案* 當時看到師兄用多執行緒下載一個檔案,簡直帥呆了,然後自己偷摸學習了一下,很爽,這邊推薦兩個命令列下載網路檔案的方法,前提是要有下載連結哦! 一、 1.wget下載方式 wget http://www.linuxsense.or

    Android學習筆記 三二 執行 後臺非同步任務AsyncTask

    去五金店買個鑽,不是因為我們需要鑽,我們只需需要孔,既然五金店無法買孔,退而求其次,買打孔的工具。同樣的對於後臺執行緒,我們真正需要的是能夠在UI主執行緒外進行處理,Android提供一個讓程式設計師編寫後臺操作更為容易和透明AsyncTask。使用AsyncTask,需要建立AsyncTask的資料,並實現

    學習筆記之Java執行安全雜談(上)——執行安全概念和基本方案

    執行緒安全問題絕對是併發開發中一個重點中的重點,這篇就來說說執行緒安全相關的一些問題。執行緒安全是什麼概念?這個概念說簡單也簡單,說複雜也複雜,“安全”的概念是什麼,用我個人的話說的淺顯些,就是類/物件本身在多執行緒併發執行的場景下,能夠保證程式的邏輯是可以接受的而不是被

    PyQt5學習筆記16----PyQt訊號和槽傳遞額外引數

    使用Pyqt程式設計過程中,經常會遇到給槽函式傳遞額外引數的情況。但是訊號-槽機制只是指定訊號如何連線到槽,訊號定義的引數被傳遞給槽,而額外的引數(使用者定義)不能直接傳遞。 而傳遞額外引數又是很有用處。你可能使用一個槽處理多個元件的訊號,有時要傳遞額外的資訊。 一

    13.執行通訊

    多個執行緒在操作同一個資源,操作動作不同 package 執行緒通訊; import java.security.interfaces.RSAKey; import 電話號碼.Main; /*  * 例子:生產者消費者  * 如果兩個執行緒生成,兩個執行緒消費  */ pu

    筆記九:執行通訊(pthread_create()和pthread_self())

    linux高階程式設計之執行緒間的通訊:(pthread_create()、pthread_self()) 1.執行緒概念     執行緒包含了表示程序內執行環境必須得資訊,其中包括程序中標識執行緒