IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Afficher des graphiques matplotlib dans une fenetre faite avec Qt 5


Sujet :

PyQt Python

  1. #1
    Candidat au Club
    Homme Profil pro
    technicien batiment
    Inscrit en
    Août 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : technicien batiment

    Informations forums :
    Inscription : Août 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Afficher des graphiques matplotlib dans une fenetre faite avec Qt 5
    Bonjour à tous ,

    Je cherche à brancher 3 boutons respectivement sur 3 canevas .Chaque bouton doit afficher une courbe sur un des 3 canevas fait avec matplotlib .Alors les boutons sont bien branchés mais les courbes ne s'affichent pas .
    Merci de votre indulgence , je débute en python + Qt designer . Les concepts de classe , d'objet parent - enfant etc... ne sont pas maîtrisés .

    Voir le code dans la pièce jointe .
    Fichiers attachés Fichiers attachés

  2. #2
    Candidat au Club
    Homme Profil pro
    technicien batiment
    Inscrit en
    Août 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : technicien batiment

    Informations forums :
    Inscription : Août 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Bonjour , j'aie trouvé une solution assez satisfaisante sauf pour un bouton avec un graphique dynamique . J'ai un objet new_timer qui n'est pas détecté à l'intérieur d'une fonction nommée "sinusoiddynamyque" .
    Probablement une erreur de portée , si quelqu'un à une idée , ce n'est pas de refus ...

    J'aie aussi une NavigationToolBar qui s'affiche mais pas au bon endroit .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.addToolBar(QtCore.Qt.BottomToolBarArea,NavigationToolbar(dynamic_canvas, self))
    .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    import sys
    import time
    import random
    import numpy as np
     
    from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QAction, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QSpacerItem, QSizePolicy, QPushButton, QMessageBox
    from PyQt5.QtGui import QIcon
    from PyQt5.QtCore import QSize
     
    from matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5
    if is_pyqt5():
        from matplotlib.backends.backend_qt5agg import (
            FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
    else:
        from matplotlib.backends.backend_qt4agg import (
            FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
    from matplotlib.figure import Figure
     
     
     
    class ApplicationWindow(QtWidgets.QMainWindow):
        def __init__(self):
            super(ApplicationWindow, self).__init__()
     
            self._main = QtWidgets.QWidget()
            self.setCentralWidget(self._main)
            layoutV = QtWidgets.QVBoxLayout(self._main)
            self.setWindowTitle("test")
            self.setGeometry(20, 20, 1000, 1000)
     
            self.statusBar().showMessage('Ready')  # Faire une barre de status
     
            mainMenu = self.menuBar()  #creer d'abord une barre de menu vide avant de la remplir d'entête de menus divers
            mainMenu.setNativeMenuBar(False)
            fileMenu = mainMenu.addMenu('Fichier')  # tapes l'entête du menu
            helpMenu = mainMenu.addMenu('Aide')
            EditMenu = mainMenu.addMenu('Editer')
            OuvrirFichier = QAction(QIcon('Fichier.png'),'Ouvrir',self)
            OuvrirFichier.setShortcut('Ctrl+O')
            OuvrirFichier.setStatusTip('Ouvrir un fichier')
            OuvrirFichier.triggered.connect(self.repaint)
            fileMenu.addAction(OuvrirFichier) # Cette une des ligne du menu tape le menu 'Ouvrir un fichier à l'écran 
            exitMenu = QAction(QIcon('exit24.png'), 'Exit', self)
            exitMenu.setShortcut('Ctrl+Q')
            exitMenu.setStatusTip('Exit application')
            exitMenu.triggered.connect(self.close)  # ferme l'application en prenant le menu Fichier
            fileMenu.addAction(exitMenu)
     
            Boutongraph1 = QPushButton("Drole de graphe",self) # creer un bouton à l'écran oK mais cela ne dit pas ou 
            layoutV.addWidget(Boutongraph1) # ce bouton met le dans le calque layoutV maintenant je sais ou est le bouton
            Boutongraph1.clicked.connect(self.graphstatic)
            Boutongraph2 = QPushButton("Courbe sinus",self)
            layoutV.addWidget(Boutongraph2)
            Boutongraph2.clicked.connect(self.sinusoiddynamyque)
            Boutongraph3 = QPushButton("Données aléatoires",self)
            layoutV.addWidget(Boutongraph3)
            Boutongraph3.clicked.connect(self.plotaleatoire)
     
            Hlayout = QHBoxLayout() #creer un calque "honrizontal"
            Hlayout.addWidget(Boutongraph1) # et ajoute lui un widget ici un bouton
            Hlayout.addWidget(Boutongraph2) # et ajoutes lui un  2 ème bouton
            Hlayout.addWidget(Boutongraph3) # et ajoute lui encore un bouton
            layoutV.addLayout(Hlayout)  # et ajoute le Hlayout dans le Layout vertical
     
            static_canvas = FigureCanvas(Figure(figsize=(5, 3)))  # creer un canevas
            layoutV.addWidget(static_canvas) # et mets le dans le layoutV
            self.addToolBar(NavigationToolbar(static_canvas, self)) # ajoutes lui aussi une barre de navigation
            dynamic_canvas = FigureCanvas(Figure(figsize=(5, 3)))  # creer un 2 ème canevas
            layoutV.addWidget(dynamic_canvas) # et met le aussi dans le layoutV
            self.addToolBar(QtCore.Qt.BottomToolBarArea,NavigationToolbar(dynamic_canvas, self))
            canvas3 = FigureCanvas(Figure(figsize=(5, 3)))  # creer un 3 ème canevas
            layoutV.addWidget(canvas3) # et met le aussi dans le layoutV
            self.addToolBar(QtCore.Qt.BottomToolBarArea,NavigationToolbar(canvas3, self))
     
            self._static_ax = static_canvas.figure.add_subplot(111)  # cette ligne ne pouvais pas être mis dans la fonction graphstatic sinon le bouton n'afficher pas le graphique  ce sont les axes du premier canevas appeler static_canvas
            self._dynamic_ax = dynamic_canvas.figure.add_subplot(111) # creer les axes du 2 ème canevas le canevas dynamique
            self.axescanvas3 = canvas3.figure.add_subplot(111) # creer les axes du 3 ème canevas
     
            self._timer = dynamic_canvas.new_timer(100, [(self._update_canvas, (), {})])
            #self._timer.start()
     
     
     
        def graphstatic(self,static_canvas):  # il fallait aussi transmettre le 2 ème paramètre static_canvas à la fonction graphstatic
            t = np.linspace(0, 10, 501)
            self._static_ax.plot(t, np.tan(t), ".")
            self._static_ax.figure.canvas.draw()
     
        def sinusoiddynamyque(self,dynamic_canvas,_timer):
     
            self._timer = dynamic_canvas.new_timer(100, [(self._update_canvas, (), {})])   #ne fonctionne pas car new_timer n'est pas détecté problème de portée ?
            self._timer.start()
     
     
        def _update_canvas(self,dynamic_canvas):
            self._dynamic_ax.clear()
            t = np.linspace(0, 10, 101)
            # Shift the sinusoid as a function of time.
            self._dynamic_ax.plot(t, np.sin(t + time.time()))
            self._dynamic_ax.figure.canvas.draw()
     
        def plotaleatoire(self,canvas3):
            print("hmm tjs le meme probleme")
            data = [random.random() for i in range(250)]
            #ax = self.figure.add_subplot(111)
            self.axescanvas3.plot(data, 'r-', linewidth = 0.5)
            self.axescanvas3.set_title('PyQt Matplotlib Example')
            self.axescanvas3.figure.canvas.draw()
     
     
    if __name__ == "__main__":
        qapp = QtWidgets.QApplication(sys.argv)
        app = ApplicationWindow()
        app.show()
        qapp.exec_()

  3. #3
    Candidat au Club
    Homme Profil pro
    technicien batiment
    Inscrit en
    Août 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : technicien batiment

    Informations forums :
    Inscription : Août 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Pour la NavigationToolBar mal placée , je viens de boucher le trou en désignant le calque sur lequel , elle devait se trouver .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    static_canvas = FigureCanvas(Figure(figsize=(5, 3)))  # creer un canevas
            layoutV.addWidget(static_canvas) # et mets le dans le layoutV
            ToolBar1= NavigationToolbar(static_canvas, self)
            self.addToolBar(ToolBar1) # ajoutes lui aussi une barre de navigation
            layoutV.addWidget(ToolBar1)  
            dynamic_canvas = FigureCanvas(Figure(figsize=(5, 3)))  # creer un 2 ème canevas
            layoutV.addWidget(dynamic_canvas) # et met le aussi dans le layoutV
            ToolBar2 = NavigationToolbar(dynamic_canvas, self)
            self.addToolBar(QtCore.Qt.BottomToolBarArea,ToolBar2)
            layoutV.addWidget(ToolBar2)
            canvas3 = FigureCanvas(Figure(figsize=(5, 3)))  # creer un 3 ème canevas
            layoutV.addWidget(canvas3) # et met le aussi dans le layoutV
            ToolBar3 = NavigationToolbar(canvas3, self)
            self.addToolBar(QtCore.Qt.BottomToolBarArea,ToolBar3)
            layoutV.addWidget(ToolBar3)

  4. #4
    Candidat au Club
    Homme Profil pro
    technicien batiment
    Inscrit en
    Août 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : technicien batiment

    Informations forums :
    Inscription : Août 2017
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Bonjour , alors j'aie trouvé la solution pour mon graphique dynamique relié à un bouton mais je ne comprend pas ma solution

    Il fallait que j'ajoute la ligne ci dessous dans la méthode def sinusoiddynamyque(self):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    testhopbof = FigureCanvas(Figure(figsize=(5, 3)))
    Pourquoi , cette ligne est indispensable alors que j'avais déjà crée mes 3 canevas précédemment ?



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    import sys
    import time
    import random
    import numpy as np
     
    from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QAction, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QSpacerItem, QSizePolicy, QPushButton, QMessageBox
    from PyQt5.QtGui import QIcon
    from PyQt5.QtCore import QSize
     
    from matplotlib.backends.qt_compat import QtCore, QtWidgets, is_pyqt5
    if is_pyqt5():
        from matplotlib.backends.backend_qt5agg import (
            FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
    else:
        from matplotlib.backends.backend_qt4agg import (
            FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
    from matplotlib.figure import Figure
     
     
     
    class ApplicationWindow(QtWidgets.QMainWindow):
        def __init__(self):
            super(ApplicationWindow, self).__init__()
     
            self._main = QtWidgets.QWidget()
            self.setCentralWidget(self._main)
            layoutV = QtWidgets.QVBoxLayout(self._main)
            self.setWindowTitle("test")
            self.setGeometry(20, 20, 1000, 1000)
     
            self.statusBar().showMessage('Ready')  # Faire une barre de status
     
            mainMenu = self.menuBar()  #creer d'abord une barre de menu vide avant de la remplir d'entête de menus divers
            mainMenu.setNativeMenuBar(False)
            fileMenu = mainMenu.addMenu('Fichier')  # tapes l'entête du menu
            helpMenu = mainMenu.addMenu('Aide')
            EditMenu = mainMenu.addMenu('Editer')
            OuvrirFichier = QAction(QIcon('Fichier.png'),'Ouvrir',self)
            OuvrirFichier.setShortcut('Ctrl+O')
            OuvrirFichier.setStatusTip('Ouvrir un fichier')
            OuvrirFichier.triggered.connect(self.repaint)
            fileMenu.addAction(OuvrirFichier) # Cette une des ligne du menu tape le menu 'Ouvrir un fichier à l'écran 
            exitMenu = QAction(QIcon('exit24.png'), 'Exit', self)
            exitMenu.setShortcut('Ctrl+Q')
            exitMenu.setStatusTip('Exit application')
            exitMenu.triggered.connect(self.close)  # ferme l'application en prenant le menu Fichier
            fileMenu.addAction(exitMenu)
     
            Boutongraph1 = QPushButton("Drole de graphe",self) # creer un bouton à l'écran oK mais cela ne dit pas ou 
            layoutV.addWidget(Boutongraph1) # ce bouton met le dans le calque layoutV maintenant je sais ou est le bouton
            Boutongraph1.clicked.connect(self.graphstatic)
            Boutongraph2 = QPushButton("Courbe sinus",self)
            layoutV.addWidget(Boutongraph2)
            Boutongraph2.clicked.connect(self.sinusoiddynamyque)
            Boutongraph3 = QPushButton("Données aléatoires",self)
            layoutV.addWidget(Boutongraph3)
            Boutongraph3.clicked.connect(self.plotaleatoire)
     
            Hlayout = QHBoxLayout() #creer un calque "honrizontal"
            Hlayout.addWidget(Boutongraph1) # et ajoute lui un widget ici un bouton
            Hlayout.addWidget(Boutongraph2) # et ajoutes lui un  2 ème bouton
            Hlayout.addWidget(Boutongraph3) # et ajoute lui encore un bouton
            layoutV.addLayout(Hlayout)  # et ajoute le Hlayout dans le Layout vertical
     
            static_canvas = FigureCanvas(Figure(figsize=(5, 3)))  # creer un canevas
            layoutV.addWidget(static_canvas) # et mets le dans le layoutV
            ToolBar1= NavigationToolbar(static_canvas, self)
            self.addToolBar(ToolBar1) # ajoutes lui aussi une barre de navigation
            layoutV.addWidget(ToolBar1)  # et met la NavigationToolbar sur le layout qui va bien
            dynamic_canvas = FigureCanvas(Figure(figsize=(5, 3)))  # creer un 2 ème canevas
            layoutV.addWidget(dynamic_canvas) # et met le aussi dans le layoutV
            ToolBar2 = NavigationToolbar(dynamic_canvas, self)
            self.addToolBar(QtCore.Qt.BottomToolBarArea,ToolBar2)
            layoutV.addWidget(ToolBar2) #et le met la NavigationToolbar sur le layout qui va bien
            canvas3 = FigureCanvas(Figure(figsize=(5, 3)))  # creer un 3 ème canevas
            layoutV.addWidget(canvas3) # et met le aussi dans le layoutV
            ToolBar3 = NavigationToolbar(canvas3, self)
            self.addToolBar(QtCore.Qt.BottomToolBarArea,ToolBar3)
            layoutV.addWidget(ToolBar3)  #et met la NavigationToolbar sur le layout qui va bien
     
            self._static_ax = static_canvas.figure.add_subplot(111)  # cette ligne ne pouvais pas être mis dans la fonction graphstatic sinon le bouton n'afficher pas le graphique  ce sont les axes du premier canevas appeler static_canvas
     
            self.axescanvas3 = canvas3.figure.add_subplot(111) # creer les axes du 3 ème canevas
     
            self._dynamic_ax = dynamic_canvas.figure.add_subplot(111) # creer les axes du 2 ème canevas le canevas dynamique
            #self._timer = dynamic_canvas.new_timer(100, [(self._update_canvas, (), {})])
            #self._timer.start()   # fonctionne mais sans le déclenchement du bouton
     
     
        def graphstatic(self,static_canvas):  # il fallait aussi transmettre le 2 ème paramètre static_canvas à la fonction graphstatic
            t = np.linspace(0, 10, 501)
            self._static_ax.plot(t, np.tan(t), ".")
            self._static_ax.figure.canvas.draw()
     
        def sinusoiddynamyque(self):
     
            testhopbof = FigureCanvas(Figure(figsize=(5, 3)))
     
            self._timer = testhopbof.new_timer(100, [(self._update_canvas, (), {})])   #ne fonctionne pas car new_timer n'est pas détecté problème de portée ?
            self._timer.start()
     
     
        def _update_canvas(self):
            self._dynamic_ax.clear()
            t = np.linspace(0, 10, 101)
            # Shift the sinusoid as a function of time.
            self._dynamic_ax.plot(t, np.sin(t + time.time()))
            self._dynamic_ax.figure.canvas.draw()
     
        def plotaleatoire(self,canvas3):
     
            data = [random.random() for i in range(250)]
            #ax = self.figure.add_subplot(111)
            self.axescanvas3.plot(data, 'r-', linewidth = 0.5)
            self.axescanvas3.set_title('PyQt Matplotlib Example')
            self.axescanvas3.figure.canvas.draw()
     
     
    if __name__ == "__main__":
        qapp = QtWidgets.QApplication(sys.argv)
        app = ApplicationWindow()
        app.show()
        qapp.exec_()

Discussions similaires

  1. Afficher des graphiques dynamiques dans une JSP
    Par cereal dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 27/03/2012, 11h35
  2. Afficher des éléments HTML dans une WindowsForm
    Par flagadda dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/04/2007, 17h31
  3. Afficher des balises HTML dans une chaine javascript
    Par lapaupiette dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/03/2007, 10h19
  4. afficher des etats ireports dans une appli jsf
    Par ouedmouss dans le forum Documents
    Réponses: 1
    Dernier message: 09/02/2007, 07h05
  5. afficher de l'opengl dans une fenetre web
    Par soubre dans le forum OpenGL
    Réponses: 7
    Dernier message: 16/09/2005, 18h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo