import sys import time import logging import shutil from os import path, listdir, environ from PyQt5 import QtCore, QtGui, QtWidgets import matplotlib.pyplot as plt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar __author__ = "Debulois Quentin" __version__ = "1.0" class Main(QtWidgets.QMainWindow): def __init__(self): super(Main, self).__init__() logo = "stats.ico" largeur = 1200 hauteur = 600 ecranLargeur = QtWidgets.QApplication.primaryScreen().size().width() ecranHauteur = QtWidgets.QApplication.primaryScreen().size().height() self.setGeometry(int((ecranLargeur - largeur) / 2), int((ecranHauteur - hauteur) / 2), largeur, hauteur) self.setWindowTitle("Calcul de corrélation.") self.setWindowIcon(QtGui.QIcon(logo)) apropos = QtWidgets.QAction("&A propos.", self) apropos.setStatusTip("A propos de l'application.") apropos.triggered.connect(self.a_propos_application) quitter = QtWidgets.QAction("&Quitter.", self) quitter.setStatusTip("Quitter l'application.") quitter.triggered.connect(self.closeEvent) self.statusBar() mainMenu = self.menuBar() fileMenu = mainMenu.addMenu("&Menu") fileMenu.addAction(apropos) fileMenu.addAction(quitter) #self.nettoyage_pyinstaller() self.home() def home(self): self.nomFacteurA = "A" self.nomFacteurB = "B" self.nombreFacteur = 3 self.mainLayout = QtWidgets.QHBoxLayout() self.gaucheLayout = QtWidgets.QVBoxLayout() self.droiteLayout = QtWidgets.QVBoxLayout() ######################################################################################## self.formGroupBoxFacteurA = QtWidgets.QGroupBox("Facteur {0}.".format(self.nomFacteurA)) self.layoutA = QtWidgets.QFormLayout() self.layoutA.setSpacing(10) self.nomFacteurALabel = QtWidgets.QLabel("Nom du facteur {0} : ".format(self.nomFacteurA)) self.nomFacteurAEdit = QtWidgets.QLineEdit("") self.layoutA.addRow(self.nomFacteurALabel, self.nomFacteurAEdit) self.nombreFacteurALabel = QtWidgets.QLabel("Valeur 1 de {0}: ".format(self.nomFacteurA)) self.nombreFacteurAEdit = QtWidgets.QLineEdit("") self.layoutA.addRow(self.nombreFacteurALabel, self.nombreFacteurAEdit) self.nombreFacteurALabel = QtWidgets.QLabel("Valeur 2 de {0}: ".format(self.nomFacteurA)) self.nombreFacteurAEdit = QtWidgets.QLineEdit("") self.layoutA.addRow(self.nombreFacteurALabel, self.nombreFacteurAEdit) self.nombreFacteurALabel = QtWidgets.QLabel("Valeur {0} de {1}: ".format(self.nombreFacteur, self.nomFacteurA)) self.nombreFacteurAEdit = QtWidgets.QLineEdit("") self.layoutA.addRow(self.nombreFacteurALabel, self.nombreFacteurAEdit) self.formGroupBoxFacteurA.setLayout(self.layoutA) self.scrollA = QtWidgets.QScrollArea() self.scrollA.setWidget(self.formGroupBoxFacteurA) self.scrollA.setWidgetResizable(True) ######################################################################################## self.formGroupBoxFacteurB = QtWidgets.QGroupBox("Facteur {0}.".format(self.nomFacteurB)) self.layoutB = QtWidgets.QFormLayout() self.layoutB.setSpacing(10) self.nomFacteurBLabel = QtWidgets.QLabel("Nom du facteur {0} : ".format(self.nomFacteurB)) self.nomFacteurBEdit = QtWidgets.QLineEdit("") self.layoutB.addRow(self.nomFacteurBLabel, self.nomFacteurBEdit) self.nombreFacteurBLabel = QtWidgets.QLabel("Valeur 1 de {0}: ".format(self.nomFacteurB)) self.nombreFacteurBEdit = QtWidgets.QLineEdit("") self.layoutB.addRow(self.nombreFacteurBLabel, self.nombreFacteurBEdit) self.nombreFacteurBLabel = QtWidgets.QLabel("Valeur 2 de {0}: ".format(self.nomFacteurB)) self.nombreFacteurBEdit = QtWidgets.QLineEdit("") self.layoutB.addRow(self.nombreFacteurBLabel, self.nombreFacteurBEdit) self.nombreFacteurBLabel = QtWidgets.QLabel("Valeur {0} de {1}: ".format(self.nombreFacteur, self.nomFacteurB)) self.nombreFacteurBEdit = QtWidgets.QLineEdit("") self.layoutB.addRow(self.nombreFacteurBLabel, self.nombreFacteurBEdit) self.formGroupBoxFacteurB.setLayout(self.layoutB) self.scrollB = QtWidgets.QScrollArea() self.scrollB.setWidget(self.formGroupBoxFacteurB) self.scrollB.setWidgetResizable(True) ######################################################################################## self.buttonBox = QtWidgets.QDialogButtonBox() self.btnAjouterLigne = self.buttonBox.addButton("Ajouter une ligne", QtWidgets.QDialogButtonBox.ActionRole) self.btnAjouterLigne.clicked.connect(self.ajouter_ligne_facteur) self.btnAjouterLigne = self.buttonBox.addButton("Supprimer une ligne", QtWidgets.QDialogButtonBox.ActionRole) self.btnAjouterLigne.clicked.connect(self.supprimer_ligne_facteur) self.btnAjouterLigne = self.buttonBox.addButton("Calculer", QtWidgets.QDialogButtonBox.ActionRole) self.btnAjouterLigne.clicked.connect(self.wrapper) self.formLayout = QtWidgets.QHBoxLayout() self.formLayout.addWidget(self.scrollA) self.formLayout.addWidget(self.scrollB) self.gaucheLayout.addLayout(self.formLayout) self.gaucheLayout.addWidget(self.buttonBox) ######################################################################################## self.figure = plt.figure() self.figure.patch.set_facecolor("none") self.canvas = FigureCanvas(self.figure) self.toolbar = NavigationToolbar(self.canvas, self) self.droiteLayout.addWidget(self.canvas) self.droiteLayout.addWidget(self.toolbar) self.mainLayout.addLayout(self.gaucheLayout) self.mainLayout.addLayout(self.droiteLayout) self.mainWidget = QtWidgets.QWidget() self.mainWidget.setLayout(self.mainLayout) self.setCentralWidget(self.mainWidget) self.show() def wrapper(self): facteurs_a = [] facteurs_b = [] self.nomFacteurA = self.layoutA.itemAt(1).widget().text() if self.nomFacteurA == "": self.nomFacteurA = "A" self.nomFacteurB = self.layoutB.itemAt(1).widget().text() if self.nomFacteurB == "": self.nomFacteurB = "B" self.layoutA.itemAt(2).widget().setText("Valeur 1 de {0}: ".format(self.nomFacteurA)) self.layoutA.itemAt(4).widget().setText("Valeur 2 de {0}: ".format(self.nomFacteurA)) self.layoutA.itemAt(6).widget().setText("Valeur 3 de {0}: ".format(self.nomFacteurA)) self.layoutB.itemAt(2).widget().setText("Valeur 1 de {0}: ".format(self.nomFacteurB)) self.layoutB.itemAt(4).widget().setText("Valeur 2 de {0}: ".format(self.nomFacteurB)) self.layoutB.itemAt(6).widget().setText("Valeur 3 de {0}: ".format(self.nomFacteurB)) self.nombreWidget = self.layoutA.count() for i in range(2, self.nombreWidget): if (i % 2) == 1: if self.layoutA.itemAt(i).widget().text().isdigit(): facteurs_a.append(int(self.layoutA.itemAt(i).widget().text())) else: return self.nombreWidget = self.layoutB.count() for i in range(2, self.nombreWidget): if (i % 2) == 1: if self.layoutB.itemAt(i).widget().text().isdigit(): facteurs_b.append(int(self.layoutB.itemAt(i).widget().text())) else: return self.figure.clear() plt.title("Taux de corrélation entre deux facteurs.") plt.grid(True) plt.plot([i for i in range(1, len(facteurs_a) + 1)], facteurs_a, "o-r", label=self.nomFacteurA) plt.plot([i for i in range(1, len(facteurs_b) + 1)], facteurs_b, "o-b", label=self.nomFacteurB) plt.axis([0, len(facteurs_a) + 1, 0, max([max(facteurs_a), max(facteurs_b)]) + 1]) ann = plt.annotate("Le taux de correlation est de: " + self.calcul_correlation(facteurs_a, facteurs_b), xy=(1, 1), bbox=dict(facecolor='white')) ann.draggable() plt.legend() self.canvas.draw() def ajouter_ligne_facteur(self): self.nombreFacteur += 1 self.nombreFacteurALabel = QtWidgets.QLabel("Valeur {0} de {1}: ".format(self.nombreFacteur, self.nomFacteurA)) self.nombreFacteurAEdit = QtWidgets.QLineEdit("") self.layoutA.addRow(self.nombreFacteurALabel, self.nombreFacteurAEdit) self.nombreFacteurBLabel = QtWidgets.QLabel("Valeur {0} de {1}: ".format(self.nombreFacteur, self.nomFacteurB)) self.nombreFacteurBEdit = QtWidgets.QLineEdit("") self.layoutB.addRow(self.nombreFacteurBLabel, self.nombreFacteurBEdit) self.formGroupBoxFacteurA.setLayout(self.layoutA) self.formGroupBoxFacteurB.setLayout(self.layoutB) def supprimer_ligne_facteur(self): if self.nombreFacteur > 3: self.layoutA.removeRow(self.nombreFacteur) self.layoutB.removeRow(self.nombreFacteur) self.formGroupBoxFacteurA.setLayout(self.layoutA) self.formGroupBoxFacteurB.setLayout(self.layoutB) self.nombreFacteur -= 1 def a_propos_application(self): QtWidgets.QMessageBox.about(self, "A propos", "Auteur : " + __author__ + "\nVersion : " + __version__) def calcul_correlation(self, facteurs_a, facteurs_b): moyenne_a = sum(facteurs_a) / len(facteurs_a) moyenne_b = sum(facteurs_b) / len(facteurs_b) soustractions_a = [] soustractions_b = [] numerateurs_1 = [] denominateurs_1 = [] denominateurs_2 = [] for i in facteurs_a: soustractions_a.append(i - moyenne_a) for i in facteurs_b: soustractions_b.append(i - moyenne_b) for k, v in enumerate(soustractions_a): numerateurs_1.append(v * soustractions_b[k]) for i in soustractions_a: denominateurs_1.append(i ** 2) for i in soustractions_b: denominateurs_2.append(i ** 2) resultat = sum(numerateurs_1) / (sum(denominateurs_1) * sum(denominateurs_2)) ** 0.5 return str(round(resultat, 3)) def nettoyage_pyinstaller(self): jour = 86400 timestamp = time.time() for i in listdir(environ["TMP"]): if i.startswith("_MEI"): timestamp_modification = int(path.getmtime(path.join(environ["TMP"], i))) if timestamp_modification < (timestamp - jour): shutil.rmtree(path.join(environ["TMP"], i)) def main(): app = QtWidgets.QApplication(sys.argv) app.setStyleSheet("QScrollArea{border : none}") GUI = Main() sys.exit(app.exec_()) if __name__ == "__main__": main()