[python][pyqt4] UI線程和邏輯線程的分離

在寫python和UI文件的結合時,一定要注意不能在子線程操作UI界面,或者將UI的更新放在循環中,否則會造成UI線程的阻塞,導致界面卡死,等到邏輯循環結束,UI纔會恢復。


那麼如何將UI線程和邏輯線程分離呢?這裏需要用到slot和signal的概念。

先看一下底下這個例子,當程序開始運行時拋出一個線程,線程中每兩秒發出一個信號,信號的接收端是更換圖片函數self.signal_pictures_function。

import threading
#自己寫的線程,繼承父類threading.Thread
class Thread(threading.Thread):
    def __init__(self, signal_pictures):
        threading.Thread.__init__(self)
        #定義更換圖片信號
        self.signal_pictures = signal_pictures
    def run(self):
        while True:
            #每隔兩秒,信號發射一次
            self.signal_pictures.emit()
            time.sleep(2)

class Mainpage (QDialog, Mainpage.Ui_Mainpage):
    # 聲明信號
    signal_pictures=QtCore.pyqtSignal()
    flag=0
    def __init__(self, parent=None):
        super(Mainpage, self).__init__(parent)
        self.setupUi(self)

        #信號關聯更換圖片函數
        self.signal_pictures.connect(self.signal_pictures_function)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainpage = Mainpage()
    mainpage.show()
    #拋出線程
    Thread(mainpage.signal_pictures).start()
    app.exec_()


如果需要傳遞參數,可以在生命信號時加上參數的類型聲明,例如:

#無參數傳遞
signal=QtCore.pyqtSignal()
#傳遞字典參數
signal= QtCore.pyqtSignal(dict)  
#傳遞一個整數
signal=QtCore.pyqtSignal(int)





發佈了35 篇原創文章 · 獲贊 11 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章