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 :

Widget MatplotLib : problème d'affichage


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Par défaut Widget MatplotLib : problème d'affichage
    Bonjour,

    j'ai créé une IHM via QtDesigner incluant un widget QTableWidget (nommé "tableValeurs") et un widget MatplotlibWidget (nommé "matplotlibWidget").
    Je souhaite afficher des lignes dans ce widget mais la figure reste vide, rien ne s'affiche...
    Voici mon code:

    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
    import sys, os
    from PyQt4 import QtGui
    from PyQt4 import QtCore
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
    import matplotlib.pyplot as plt
    import IHM.IHM_MaFenetre
     
    class MaFenetre(QtGui.QDialog, IHM.IHM_MaFenetre.Ui_MaFenetre):
        def __init__(self, parent=None):
            '''
            Constructeur de MaFenetre
            '''
            # Initialisation de l'IHM
            super(MaFenetre, self).__init__()
            self.ui = IHM.IHM_MaFenetre.Ui_MaFenetre()
            self.ui.setupUi(self)
     
            # Initialisation du matplotlib widget
            self.ui.matplotlibWidget.figure = plt.Figure(facecolor='white')
            self.ui.matplotlibWidget.canvas = FigureCanvas(self.ui.matplotlibWidget.figure)
            self.ui.matplotlibWidget.axes = self.ui.matplotlibWidget.figure.add_subplot(111)
     
            # Le SLOT "updateGraphe" est appelé lorsque l'utilisateur modifie une valeur dans le QTableWidget
            self.ui.tableValeurs.cellChanged.connect(self.updateGraphe)
     
            def updateGraphe(self):
                '''
                Mise a jour du graphe en fonction des valeurs du tableau
                Ici avec des valeurs fixes pour test
                '''
                # Reinitialisation du graphe
                self.ui.matplotlibWidget.axes.cla()
                self.ui.matplotlibWidget.axes.hold(True)
     
                # Dessin des lignes
                hlineLarg = self.ui.matplotlibWidget.axes.axhline(y=0, xmin=1, xmax = 2)
                hlineMid = self.ui.matplotlibWidget.axes.axhline(y=0.5, xmin=2, xmax = 3)
                hlineEcart = self.ui.matplotlibWidget.axes.axhline(y=1, xmin=3, xmax = 4)
                self.ui.matplotlibWidget.axes.add_artist(hlineLarg)
                self.ui.matplotlibWidget.axes.add_artist(hlineMid)
                self.ui.matplotlibWidget.axes.add_artist(hlineEcart)
     
               # Affichage du graphe
               self.ui.matplotlibWidget.canvas.draw()
    Je ne maîtrise pas encore très bien matplotlib, en tout cas je ne vois pas ce qui cloche et pourquoi mes lignes ne s'affichent pas!
    Merci d'avance pour votre aide.

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Par défaut
    Salut,
    Et en ajoutant après le draw :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.ui.matplotlibWidget.canvas.plot(***)
    self.ui.matplotlibWidget.canvas.show()
    en mettant quelque chose dans le plot.

  3. #3
    Membre éclairé
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Par défaut
    Merci de ta réponse,

    cependant cela ne fonctionne pas pour moi,
    en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.ui.matplotlibWidget.canvas.plot([0,0])
    J'ai un message "AttributeError: 'FigureCanvasQTAgg' object has no attribute 'plot'.

    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.ui.matplotlibWidget.axes.plot([0,0])
    self.ui.matplotlibWidget.canvas.show()
    Ma fenêtre s'ouvre sans erreur, mais j'ai également une nouvelle sous-fenêtre contenant uniquement le matplotlibWidget, tout reste vide (dans ma fenêtre et dans la nouvelle sous-fenêtre).

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Je ne sais pas tester parce que je ne vois pas d'où tu sors ce matplotlibWidget, il ne semble pas exister dans les packages de ma distrib.

    Quoiqu'il en soit, il y a tout de même des choses étranges dans ta construction.
    Tu dis que tu as créé la fenêtre principale avec le Designer. Est-ce une MainWindow, un QWidget, QDialog ?

    Qu'est-ce que la classe MaFenetre, pourquoi hérite-t-elle d'abord de QDialog alors que ce n'en est manifestement pas un et aussi de IHM.IHM_MaFenetre.Ui_MaFenetre alors qu'une classe ne peut hériter de deux classe Qt ? Et d'autant plus que tu utilises self.ui = IHM.IHM_MaFenetre.Ui_MaFenetre() ce qui n'a pas de sens.

    On peut voir le code de IHM.IHM_MaFenetre.Ui_MaFenetre ? Histoire de comprendre comment est implémenté ta fenêtre principale.

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Par défaut
    J'ai les mêmes problèmes que VinsS. Cela dit, d'après ce que je comprends du code (un problème d'utilisation de matplotlib), je peux proposer un exemple avec Tk :

    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
    # -*- coding: utf-8 -*-
     
    import matplotlib
    matplotlib.use('TkAgg')
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg as FigureCanvas
    from matplotlib.figure import Figure
    import numpy as np
    import tkinter as tk
     
     
    def press(event=None):
        global idx
        if event.key == "left" and idx > 0:
            idx -= 1
        elif event.key == "right" and idx < np.size(w) - 1:
            idx += 1
        else:
            return
        lines.set_ydata(func(idx))
        root.title("w = {:5.2f}".format(w[idx]))
        canvas.show()
     
     
    if __name__ == '__main__':
        root = tk.Tk()
     
        t = np.linspace(0, 6 * np.pi, 512)
        w = np.arange(2.0, 5.0, 0.2)
        func = lambda index: np.cos(w[index] * t)
     
        figure = Figure(figsize=(5, 4), dpi=100)
     
        axes = figure.add_subplot(111)
        idx = 0
        lines, = axes.plot(t, func(idx))
     
        canvas = FigureCanvas(figure, master=root)
        canvas.show()
        canvas.get_tk_widget().pack()
        canvas.mpl_connect('key_press_event', press)
     
        root.title("w = {:5.2f}".format(w[idx]))
        root.mainloop()
    Les étapes doivent être les mêmes avec Qt (je dis ça mais en fait je n'utilise pas Qt).

  6. #6
    Membre éclairé
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Par défaut
    Merci de vos réponses,
    en fait j'utilise PythonXY, qui inclut python2.7 et Qt4.8. C'est une distribution python orientée pour le domaine scientifique.
    En effet je n'avais pas vu mais le widget MatplotLibWidget est spécifique à pythonXY, j'ai ce widget de disponible dans ma version de QtDesigner dans une catégorie "PythonXY". Du coup je suis désolée je ne sais pas comment vous pouvez faire pour tester j'ai trouvé ça mais je ne sais pas ce que ça vaut: http://wiki.scipy.org/Cookbook/Matpl...n_and_Designer

    Pour ce qui est de la structure de mon code je vais détailler un peu, en fait MaFenetre est une sous-fenêtre de mon application principale. MaFenetre est un QDialog.
    Voilà comment je l'ai créée:
    - J'ai créé un QDialog dans QtDesigner. J'ai nommé ce QDialog "MaFenetre".
    - J'ai enregistré le fichier ui dans un dossier nommé "IHM". Mon fichier ui se nomme IHM_MaFenetre.ui,
    - j'ai utilisé la commande pyuic4 pour générer un fichier python à partir du fichier ui. J'ai donc un fichier IHM_MaFenetre.py dans le dossier IHM.
    - ce fichier python contient la classe Ui_MaFenetre contenant elle même la méthode setupUi. Voilà le code du fichier IHM_MaFenetre.py, ce n'est pas mon vrai code car je ne peux pas le divulger mais j'ai adapté:

    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
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'C:\Users\Prenom\monProjet\IHM\IHM_MaFenetre.ui'
    #
    # Created: Tue Feb 11 15:03:17 2014
    #      by: PyQt4 UI code generator 4.9.5
    #
    # WARNING! All changes made in this file will be lost!
     
    from PyQt4 import QtCore, QtGui
     
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        _fromUtf8 = lambda s: s
     
    class Ui_MaFenetre(object):
        def setupUi(self, MaFenetre):
            MaFenetre.setObjectName(_fromUtf8("MaFenetre"))
            MaFenetre.setWindowModality(QtCore.Qt.ApplicationModal)
            MaFenetre.resize(568, 486)
     
            self.table_valeurs = QtGui.QTableWidget(MaFenetre)
            self.table_valeurs.setMinimumSize(QtCore.QSize(203, 0))
            self.table_valeurs.setMaximumSize(QtCore.QSize(200, 16777215))
            self.table_valeurs.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
            self.table_valeurs.setObjectName(_fromUtf8("table_valeurs"))
     
            self.matplotlibWidget = MatplotlibWidget(MaFenetre)
            self.matplotlibWidget.setMinimumSize(QtCore.QSize(0, 70))
            self.matplotlibWidget.setObjectName(_fromUtf8("matplotlibWidget"))
            self.gridLayout_4.addWidget(self.matplotlibWidget, 0, 0, 1, 1)
            self.gridLayout_5.addWidget(self.gb_graphe, 2, 0, 1, 2)
     
            self.buttonBox = QtGui.QDialogButtonBox(MaFenetre)
            self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
            self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
            self.gridLayout_5.addWidget(self.buttonBox, 3, 1, 1, 1)
     
    from matplotlibwidget import MatplotlibWidget
    Ensuite, j'ai créé un nouveau fichier python dans le dossier parent de "IHM", nommé GestionMaFenetre.py. C'est le fichier que je vous ai montré au départ. Sauf que en effet l'héritage avec IHM.IHM_MaFenetre.Ui_MaFenetre n'a rien à faire là c'est une erreur de ma part! De plus je vais renommer cette classe en GestionMaFenetre car le nom porte à confusion.

    J'ai donc:
    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
    import sys, os
    from PyQt4 import QtGui
    from PyQt4 import QtCore
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
    import matplotlib.pyplot as plt
    import IHM.IHM_MaFenetre
     
    class GestionMaFenetre(QtGui.QDialog):
        def __init__(self, parent=None):
            '''
            Constructeur de GestionMaFenetre
            '''
            # Initialisation de l'IHM
            super(GestionMaFenetre, self).__init__()
            self.ui = IHM.IHM_MaFenetre.Ui_MaFenetre()
            self.ui.setupUi(self)
     
            # Initialisation du matplotlib widget
            self.ui.matplotlibWidget.figure = plt.Figure(facecolor='white')
            self.ui.matplotlibWidget.canvas = FigureCanvas(self.ui.matplotlibWidget.figure)
            self.ui.matplotlibWidget.axes = self.ui.matplotlibWidget.figure.add_subplot(111)
     
            # Le SLOT "updateGraphe" est appelé lorsque l'utilisateur modifie une valeur dans le QTableWidget
            self.ui.tableValeurs.cellChanged.connect(self.updateGraphe)
     
            def updateGraphe(self):
                '''
                Mise a jour du graphe en fonction des valeurs du tableau
                Ici avec des valeurs fixes pour test
                '''
                # Reinitialisation du graphe
                self.ui.matplotlibWidget.axes.cla()
                self.ui.matplotlibWidget.axes.hold(True)
     
                # Dessin des lignes
                hlineLarg = self.ui.matplotlibWidget.axes.axhline(y=0, xmin=1, xmax = 2)
                hlineMid = self.ui.matplotlibWidget.axes.axhline(y=0.5, xmin=2, xmax = 3)
                hlineEcart = self.ui.matplotlibWidget.axes.axhline(y=1, xmin=3, xmax = 4)
                self.ui.matplotlibWidget.axes.add_artist(hlineLarg)
                self.ui.matplotlibWidget.axes.add_artist(hlineMid)
                self.ui.matplotlibWidget.axes.add_artist(hlineEcart)
     
               # Affichage du graphe
               self.ui.matplotlibWidget.canvas.draw()
    Voilà j'espère avoir apporté les explications qu'il vous fallait. VinsS pourquoi dis tu que "self.ui = IHM.IHM_MaFenetre.Ui_MaFenetre()" n'a aucun sens? Comment accéder aux différents widgets de ma fenêtre dans ce cas? Je ne comprends pas.

    En fait mon problème est apparu depuis que je tente de dessiner des lignes avec axhline(). Avant j'utilisais plot() avec des valeurs aléatoires pour tester et le graphe s'affichait bien. Sauf qu'en réalité je veux représenter un chronogramme, et depuis que j'ai remplacé le plot() par add_artist() plus rien ne s'affiche.

    Je vais continuer à chercher de mon côté
    Images attachées Images attachées  

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. android.widget.imageview probléme affichage
    Par chlock62 dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 11/03/2014, 17h33
  2. Problème d'affichage de widget
    Par ze_dark dans le forum Débuter
    Réponses: 2
    Dernier message: 19/01/2011, 15h55
  3. Graphique avec matplotlib, probléme d'affichage des boutons
    Par astragoth dans le forum Général Python
    Réponses: 0
    Dernier message: 08/04/2010, 08h27
  4. QTabWidget - Problème d'affichage des widgets
    Par jimaitou dans le forum Débuter
    Réponses: 7
    Dernier message: 22/03/2009, 02h55
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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