Я посмотрел на этот ответ здесь, который был очень полезен, но он не работает как ожидается при попытке отрисовки сюжета.
График работает, но индикатор выполнения не продвигается, он просто поднимется до 100 % после рендеринга графика. Конечно, мне бы хотелось, чтобы индикатор выполнения прогрессировал во время рендеринга сюжета, а не после его завершения.
Я думаю, что мне может не хватать функции PyQt, чтобы как-то связать событие или сигнал pyqt, но на самом деле я понятия не имею, как это исправить.
Вот, кем я надеюсь стать, минимальный, полный и поддающийся проверке пример:
import sys
from pandas.tools.plotting import scatter_matrix
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import time
from PyQt5.QtWidgets import (QWidget, QProgressBar,
QPushButton, QApplication, QVBoxLayout)
from PyQt5 import QtCore, QtGui
class MyCustomWidget(QWidget):
def __init__(self, parent=None):
super(MyCustomWidget, self).__init__(parent)
layout = QVBoxLayout(self)
self.progressBar = QProgressBar(self)
self.progressBar.setRange(0,1)
layout.addWidget(self.progressBar)
self.count = 0
button = QPushButton("Start", self)
layout.addWidget(button)
self.df = pd.DataFrame(np.random.rand(3, 12))
button.clicked.connect(self.onStart)
self.myLongTask = TaskThread()
self.myLongTask.taskFinished.connect(self.onFinished)
self.show()
def onStart(self):
scatter_matrix(self.df, alpha=0.8, figsize=(7, 7), diagonal='kde')
self.scatter = plt
self.scatter.suptitle('Data Scatter Matrix Plot', size=16)
self.progressBar.setRange(0,0)
self.progressBar.setValue(1)
self.myLongTask.start()
self.scatter.show()
def onFinished(self):
self.progressBar.setRange(0,1)
class TaskThread(QtCore.QThread):
taskFinished = QtCore.pyqtSignal()
def run(self):
time.sleep(3)
self.taskFinished.emit()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyCustomWidget()
sys.exit(app.exec_())