解决PyQt5中使用matplotlib作图阻塞主程序问题
问题:我程序中有一个按钮执行之后会分析一个数据文件,并将里面的数据做成几十张图保存本地,这样,只要我点击这个按钮,后台就开始执行matplotlib的进程,只要这个进程没结束我的主程序就一直被堵塞,这样程序没有一点流畅性。后来通过在主线程中打开一个子线程来执行作图的部分操作,还可以通过信号与槽函数,向主进程反馈子线程的进度。
- 子线程 AnaThread.py
import os
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from PyQt5.QtCore import QThread, pyqtSignal
class AnaThread(QThread):
signal_str = pyqtSignal(str)
'''创建一个信号'''
def __init__(self):
super(AnaThread, self).__init__()
self.filepath = ''
self.sql = ''
self.stack = ''
def get_info(self, sql, filepath, stack):
'''从主程序获得参数'''
self.filepath = filepath
self.sql = sql
self.stack = stack
def matplot(self):
'''作图主体程序'''
def run(self):
'''内置函数,线程启动时自动执行'''
self.matplot()
self.signal_str.emit("提交信号:successed!")
- 主程序 Main.py
import sys
import time
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication
# from PyQt5.QtWidgets import *
# from PyQt5.QtGui import *
from PyQt5.QtCore import *
from myui2 import Ui_MainWindow
from AnaThread import AnaThread
class Example(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(Example, self).__init__(parent)
self.setupUi(self)
'''子线程实例化'''
self.thread = AnaThread()
self.pushButton.clicked.connect(self.buttonClicked)
'''信号接收'''
self.thread.signal_str.connect(self.signal_receive)
def buttonClicked(self):
stack = self.comboBox.currentText()
filepath = fr'{self.plainTextEdit.toPlainText()}'
sql = ''
'''向子线程传递参数'''
self.thread.get_info(sql, filepath, stack)
'''运行子线程'''
self.thread.start()
def signal_receive(self, signal_str):
'''槽函数'''
self.plainTextEdit_2.appendPlainText(signal_str)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
这样子线程不会影响主进程的执行,如果子线程运行时间很长,还可以在子线程运行的任意阶段emit signal 给主进程,让我能清楚地知道子线程的进度。