在写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)