PyQt多线程显示(举例说明)
问题描述:
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 sec
sec+=1
lcdNumber.display(sec) #LED显示数字+1
def work():
timer.start(1000) #计时器每秒计数
for i in range(2000000000):
pass
timer.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=0
class 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 sec
sec+=1
lcdNumber.display(sec) #LED显示数字+1
def work():
timer.start(1000) #计时器每秒计数
workThread.start() #计时开始
workThread.trigger.connect(timeStop) #当获得循环完毕的信号时,停止计数
def timeStop():
timer.stop()
print("运行结束用时",lcdNumber.value())
global sec
sec=0
app=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) #每次计时结束,触发setTime
top.show()
app.exec()
上述程序,将循环语句的计算部分放到新打开的线程里面计算,不会造成界面卡死。
注意:
1、pyqt
界面显示需要使用Qtime
,计算部分可调用多线程。
2、pyqtgraph
界面显示同上。
还没有评论,来说两句吧...