Pour ceux d'entre vous qui font aussi du calcul scientifique en Python, sachez qu'il est possible d'intégrer l'outil MatPlotLib, un outil de tracer de graphes, dans une application PySide6/Qt. Je vous propose un exemple relativement simple qui permet de tracer une courbe (Sinus ou Cosinus) dans MatPlotLib. Le choix de la courbe s'effectue en cliquant sur l'un des deux boutons Qt en haut de la fenêtre.
Notez que l'application permet aussi de rajouter des marqueurs sur le graphe en cliquant à la position souhaitée. Cela me permet de vous montrer comment intercepter les événements intervenant sur MatPlotLib et de les traiter.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
import sys import numpy as np from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QPushButton, QHBoxLayout, QApplication from matplotlib.figure import Figure from matplotlib.backends.backend_qtagg import FigureCanvas class MyWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Curve Tracer V1.0") # On défini le widget central avec un layout de type QVBoxLayout mainWidget = QWidget() self.setCentralWidget(mainWidget) vbox = QVBoxLayout(mainWidget) # On y ajoute deux boutons dans un layout QHBoxLayout self.__btnSinus = QPushButton("Sinus") self.__btnSinus.clicked.connect(self.btnSinusClicked) self.__btnCosinus = QPushButton("Cosinus") self.__btnCosinus.clicked.connect(self.btnCosinusClicked) hbox = QHBoxLayout() hbox.addWidget(self.__btnSinus) hbox.addWidget(self.__btnCosinus) vbox.addLayout(hbox) # On ajoute le canvas MatPlotLib en dessous de la barre de boutons self.__canvas = FigureCanvas(Figure(figsize=(4, 3))) vbox.addWidget(self.__canvas) self.__plt = self.__canvas.figure.subplots() # On connecte un gestionnaire d'événements (un slot) au clic sur le canvas. # mpl_connect == MatPlotLib_connect ;-) self.__canvas.mpl_connect("button_press_event", self.canvasClicked) # On force le tracé de la courbe Sinus à l'ouverture de la fenêtre self.btnSinusClicked() # Un slot pour réagir au clic sur le canvas MatPlotLib def canvasClicked(self, event): self.__plt.scatter(event.xdata, event.ydata, marker="+", s=100) self.__canvas.draw() # Un slot pour réagir au clic sur le bouton btnSinus def btnSinusClicked(self): self.__plt.clear() x = np.linspace(-10, 10, 1000) y = np.sin(x) self.__plt.plot(x, y, "r") self.__canvas.draw() # Un slot pour réagir au clic sur le bont btnCosinus def btnCosinusClicked(self): self.__plt.clear() x = np.linspace(-10, 10, 1000) y = np.cos(x) self.__plt.plot(x, y, "b--") self.__canvas.draw() # Démarrage de la fenêtre if __name__ == "__main__": app = QApplication(sys.argv) myWindow = MyWindow() myWindow.show() sys.exit(app.exec()) |
Et voici le résultat produit par cet exemple (pensez à cliquer sur le graphe pour ajouter les croix).
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :