[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)





你可能感兴趣的:(python)