当前位置: 代码迷 >> 综合 >> PyQt多线程显示(举例说明)
  详细解决方案

PyQt多线程显示(举例说明)

热度:67   发布时间:2023-12-13 23:34:55.0

问题描述:

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界面显示同上。