问题描述:
PyQt进行界面显示使用的主线程,
如果程序中出现大量的运算,一直占用主线程,会造成界面显示卡死或者强制退出。
举个例子:
没有使用多线程:
# coding=utf-8
__author__ = 'a359680405'from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *global sec
sec=0
def setTime():global secsec+=1lcdNumber.display(sec) #LED显示数字+1def work():timer.start(1000) #计时器每秒计数for i in range(2000000000):passtimer.stop()app=QApplication([])
top=QWidget()
layout=QVBoxLayout(top) #垂直布局类QVBoxLayout;
lcdNumber=QLCDNumber() #加个显示屏
layout.addWidget(lcdNumber)
button=QPushButton("测试")
layout.addWidget(button)timer=QTimer()
timer.timeout.connect(setTime) #每次计时结束,触发setTime
button.clicked.connect(work)top.show()
app.exec()
上述例子没有调用多线程,点击按钮之后计时器应该累加,但程序进入循环语句之后,一直在循环语句中出不来,导致显示界面卡死。
改进:使用多线程
# coding=utf-8
__author__ = 'a359680405'from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *global sec
sec=0class WorkThread(QThread):trigger = pyqtSignal()def __int__(self):super(WorkThread,self).__init__()def run(self):for i in range(203300030):print(i)self.trigger.emit() #循环完毕后发出信号def countTime():global secsec+=1lcdNumber.display(sec) #LED显示数字+1def work():timer.start(1000) #计时器每秒计数workThread.start() #计时开始workThread.trigger.connect(timeStop) #当获得循环完毕的信号时,停止计数def timeStop():timer.stop()print("运行结束用时",lcdNumber.value())global secsec=0app=QApplication([])
top=QWidget()
layout=QVBoxLayout(top) #垂直布局类QVBoxLayout;
lcdNumber=QLCDNumber() #加个显示屏
layout.addWidget(lcdNumber)
button=QPushButton("测试")
layout.addWidget(button)timer=QTimer()
workThread=WorkThread()button.clicked.connect(work)
timer.timeout.connect(countTime) #每次计时结束,触发setTimetop.show()
app.exec()
上述程序,将循环语句的计算部分放到新打开的线程里面计算,不会造成界面卡死。
注意:
1、pyqt
界面显示需要使用Qtime
,计算部分可调用多线程。
2、pyqtgraph
界面显示同上。