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 :

PyQt et Basemap (matplotlib)


Sujet :

PyQt Python

  1. #1
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    avril 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : avril 2008
    Messages : 179
    Points : 600
    Points
    600
    Par défaut PyQt et Basemap (matplotlib)
    Salut à tous !

    Bon, ça fait 4 ans que je ne suis pas venu ici, j’ai un peu honte (j’ai plein de messages privés non répondu et maintenant c’est trop tard)…

    Bref, je reviens avec une demande d’aide. Il faut voir que je suis obligé d’utiliser un environnement assez daté, donc je suis sur Python 2.7 et Qt 4 et je dois utiliser Basemap – oui, je sais qu’il est remplacé par Cartopy. En essayant de faire cohabiter tout ce beau monde, je tombe sur un problème que je n’arrive pas à corriger. Pire : je ne parviens pas à faire un exemple minimum et complet pour montrer le problème. Je me vois donc contrains de transmettre le contenu de tout mon code original, désolé.

    Tout d’abord, voici l’erreur que j’obtiens :

    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
     
    /nfs/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/bin/python2.7 /home/lebarsy/codes/swec/main/swec.py
    Traceback (most recent call last):
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/backends/backend_qt5.py", line 338, in resizeEvent
        self.draw()
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/backends/backend_qt5agg.py", line 148, in draw
        FigureCanvasAgg.draw(self)
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/backends/backend_agg.py", line 469, in draw
        self.figure.draw(self.renderer)
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/artist.py", line 59, in draw_wrapper
        draw(artist, renderer, *args, **kwargs)
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/figure.py", line 1079, in draw
        func(*args)
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/artist.py", line 59, in draw_wrapper
        draw(artist, renderer, *args, **kwargs)
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/axes/_base.py", line 1988, in draw
        self.apply_aspect()
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/axes/_base.py", line 1180, in apply_aspect
        pb1 = pb.shrunk_to_aspect(box_aspect, pb, fig_aspect)
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/transforms.py", line 596, in shrunk_to_aspect
        assert box_aspect > 0 and fig_aspect > 0
    AssertionError
    Techniquement, le code fonctionne tout de même et comme attendu, mais pour éviter des fonctionnements non désirés, je voudrais corriger cet avertissement.

    En entrant dans le détail en faisant un pas à pas, il ressort que « box_aspect » a une valeur valide, mais qu’en revanche « fig_aspect » vaut zéro. Le problème, c’est que je ne sais pas comment cela a pu se produire.

    Je vous fournis le contenu des codes tels qu’en leur état actuel, du coup avec la licence (LGPL).

    Fichier swec.py (code principal) :
    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
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
     
    #!/usr/bin/env python2.7
    # -*- coding: utf-8 -*-
     
    """
    Fichier principal de l’atelier SWEC.
     
    :module: SWEC
    :author: Yoann LE BARS
    :version: 1.0
    :date: 21/07/2017
    :date: 24/07/2017
    :date: 26/07/2017
    :date: 27/07/2017
    :date: 31/07/2017
    :date: 01/08/2017
    :date: 02/08/2017
    :date: 03/08/2017
    :date: 04/08/2017
    :date: 09/08/2017
    :date: 10/08/2017
    :date: 16/08/2017
    :date: 17/08/2017
    :date: 18/08/2017
    :date: 21/08/2017
     
       Lance la structure de base de l’application.
     
    Python 2.7 : fonctionne
    Python 3 : non-testé
     
    Copyright 2017 CNES
     
        This program is free software: you can redistribute it and/or modify it
    under the terms of the GNU Lesser General Public License as published by the
    Free Software Foundation, either version 3 of the License, or (at your
    option) any later version.
        This program is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.
    """
     
    from PyQt4 import QtCore, QtGui, uic
    import extractData
     
    class MainWindow (QtGui.QMainWindow):
        """
        Classe principale de l’application.
        """
     
        def _enCours (self):
            """
            Fait apparaître un message indiquant une fonctionnalité en cours
            d’implémentation.
            """
     
            # Boîte de dialogue affichant le message.
            dialogue = QtGui.QMessageBox()
            # Message à afficher
            message = QtCore.QCoreApplication.translate('ManWindow',
                                                        u'<p>Fonctionnalité en '
                                                        u'cours '
                                                        u"d'implémentation.</p>")
            dialogue.setText(message)
            dialogue.exec_()
     
        def _aProposSWEC (self):
            """
            Message de présentation de l’atelier SWEC.
            """
     
            QtGui.QMessageBox.about(self, u'À propos de l’atelier SWEC',
                                    u"<p>L’<b>atelier SWEC</b> est un ensemble "
                                    u"d’outils destinés au traitement des "
                                    u'données collectées par la mission '
                                    u'satellite SWIM.</p><p><b>Auteurs : </b> '
                                    u'Arnaud '
                                    u'<font style="font-variant: '
                                    u'small-caps">Jouzeau</font> et Yoann '
                                    u'<font style="font-variant: small-caps">Le '
                                    u'Bars</font></p><p>Icone maison et '
                                    u'déplacement : Dave '
                                    u'<font style="font-variant: '
                                    u'small-caps">Gandy</font> de '
                                    u'www.flaticon.com sous contrat CC 3.0 BY.</p>'
                                    u'<p>Icones précédent et suivant : Freepik '
                                    u'de www.flaticon.com sous <em>Flaticon Basic '
                                    u'License</em>.</p><p>Icone zoom : SimpleIcon '
                                    u'de www.flaticon.com sous contrat CC 3.0 '
                                    u'BY.</p><p>Icone sélection : Those Icons de '
                                    u'www.flaticon.com sous <em>Flaticon Basic '
                                    u'License</em>.</p><p>Copyright © 2017 '
                                    u'CNES</p>')
     
        def _connecterActions (self):
            """
            Association des actions aux différents éléments de l'interface.
            """
     
            self.ui.actionQuitter.triggered.connect(QtGui.qApp.quit)
            self.ui.actionAProposSWEC.triggered.connect(self._aProposSWEC)
            self.ui.actionAProposQt.triggered.connect(QtGui.qApp.aboutQt)
            self.ui.extractData.clicked.connect(self._enCours)
     
        def __init__ (self, fichier, fichierInterfaceExtractData, parent = None):
            """
            Constructeur (initialisateur) de la classe.
     
            :param fichier: Nom du fichier contenant la description QML de
                            l’interface
            :param fichierInterfaceExtractData: Nom du fichier contenant la
                                                description QML de l'interface
                                                d'extractData.
            :param parent: Pointeur vers une éventuelle classe parente.
            """
     
            super(MainWindow, self).__init__(parent)
            # Instance de l'interface de l'atelier.
            self.ui = uic.loadUi(fichier)
     
            # Message indiquant l'état de l'application.
            message = QtCore.QCoreApplication.translate('MainWindow',
                                                        u'Initialisation.')
            self.ui.statusbar.showMessage(message)
            self.ui.show()
            self._connecterActions()
     
            # Instance de l’interface pour l'extraction de données.
            self.extractData =\
                extractData.ExtractData(fichierInterfaceExtractData, self)
     
            # Message indiquant qu'une opération a été réalisée.
            self.fini = QtCore.QCoreApplication.translate('MainWindow', u'Fini.')
     
            message = QtCore.QCoreApplication.translate('MainWindow', u'Prêt.')
            self.ui.statusbar.showMessage(message)
     
    def main ():
        """
        Fonction principale du programme.
        :return: 0 si tout s’est déroulé convenablement, code d’erreur sinon.
        """
     
        import sys
        import argparse
     
        # Analyseur de la ligne de commande.
        analyseur = argparse.ArgumentParser(description=u"L’atelier SWEC est "
                                                        u"une interface "
                                                        u"graphique pour gérer "
                                                        u"les données générées "
                                                        u"par la mission "
                                                        u"satellite SWIM.")
        analyseur.add_argument("-v", "--version", action = "store_true",
                               help = u"Indique la version du programme.")
        # Arguments de la ligne de commande.
        arguments = analyseur.parse_args()
     
        if arguments.version:
            print("1.0")
            return 0
        else:
            # Instance de l'application.
            app = QtGui.QApplication(sys.argv)
            # Instance de la fenêtre principale.
            mainWindow = MainWindow('mainUi.ui', 'extractData.ui')
            return app.exec_()
     
    if __name__ == '__main__':
        main()
    Fichier extractData.py – l’erreur se produit dans ce fichier, plus particulièrement à la dernière ligne de __init__ :

    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
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
     
    # -*- coding: utf-8 -*-
     
    """
    Extraction des données depuis une collection de fichiers.
     
    :module: extractData
    :author: Yoann LE BARS
    :version: 1.0
    :date: 10/08/2017
    :date: 16/08/2017
    :date: 17/08/2017
    :date: 21/08/2017
     
    Python 2.7 : fonctionne
    Python 3 : non-testé
     
    Copyright 2017 CNES
     
        This program is free software: you can redistribute it and/or modify it
    under the terms of the GNU Lesser General Public License as published by the
    Free Software Foundation, either version 3 of the License, or (at your
    option) any later version.
        This program is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.
    """
     
    from PyQt4 import QtGui, uic
    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt4 import NavigationToolbar2QT as NavigationToolbar
    from matplotlib.widgets import RectangleSelector
    import numpy as np
     
    class ExtractData (QtGui.QWidget):
        """
        Classe principale pour l’extraction des données.
        """
     
        def _selectionAppel (self, eClic, eRelache):
            """
            Permet la sélection d’un élément à l’aide d’un rectangle.
     
            :param eClic: Évènement lorsque le bouton gauche de la souris est
                          appuyé.
            :param eRelache: Évènement correspondant à la relache du bouton
                             gauche de la souris.
            """
     
            # Localisation du pointeur de la souris lors de l’appuie du bouton
            # gauche.
            x1, y1 = eClic.xdata, eClic.ydata
            # Coordonnées du pointeur de la souris lorsque le bouton gauche est
            # relaché.
            x2, y2 = eRelache.xdata, eRelache.ydata
            # Coordonnées du premier point en latitude et longitude terrestres.
            lon1, lat1 = self.carte(x1, y1, inverse = True)
            # Coordonnées du deuxième point en latitude et longitude terrestre.
            lon2, lat2 = self.carte(x2, y2, inverse = True)
            print("(%3.2f, %3.2f) --> (%3.2f, %3.2f)" % (lon1, lat1, lon2, lat2))
     
        def _initial (self):
            """
            Retourne à la vue initiale
            """
     
            self.navigation.home()
     
        def _precedent (self):
            """
            Retourne à la vue précédente.
            """
     
            self.navigation.back()
     
        def _suivant (self):
            """
            Retourne à la vue suivante.
            """
     
            self.navigation.forward()
     
        def _deplace (self):
            """
            Déplace la vue.
            """
     
            self.navigation.pan()
     
        def _agrandi (self):
            """
            Agrandi une zone de la vue.
            """
     
            self.navigation.zoom()
     
        def _basculeSelecteur (self):
            """
            Active et désactive la sélection.
            """
     
            # if self.selecteurRectangle.active:
            #     self.selecteurRectangle.set_active(False)
            # else:
            #     self.selecteurRectangle.set_active(True)
            self.selecteurRectangle.set_active(not self.selecteurRectangle.active)
            # if evenement.key in ['Q', 'q'] and self.selecteurRectangle.active:
            #     self.selecteurRectangle.set_active(False)
            # if evenement.key in ['A', 'a'] and not self.selecteurRectangle.active:
            #     self.selecteurRectangle.set_active(True)
     
        def _connecterActions (self):
            """
            Connecte les fonctions aux évènements.
            """
     
            self.ui.boutonInitial.clicked.connect(self._initial)
            self.ui.boutonPrecedent.clicked.connect(self._precedent)
            self.ui.boutonSuivant.clicked.connect(self._suivant)
            self.ui.boutonDeplace.clicked.connect(self._deplace)
            self.ui.boutonAgrandi.clicked.connect(self._agrandi)
            self.ui.boutonSelection.clicked.connect(self._basculeSelecteur)
     
        def _definiInterface (self, parent):
            """
            Mise en place de l'interface de l’outil de sélection.
     
            :param parent: Pointeur vers le widget parent.
            """
     
            # Zone où tracer la carte.
            self.figure, self.axes = plt.subplots()
     
            # Carte en projection orthonormale.
            self.carte = Basemap(projection = 'gall', llcrnrlat = -90,
                                 urcrnrlat=90, llcrnrlon = -180, urcrnrlon = 180,
                                 resolution = 'c', ax = self.axes)
            self.carte.drawcoastlines(linewidth = 0.25)
            self.carte.fillcontinents(color = 'coral', lake_color = 'aqua')
            self.carte.drawmapboundary(fill_color = 'aqua')
            # self.carte.bluemarble()
            # Liste des parallèles à afficher.
            paralleles = np.arange(-90, 90, 30)
            self.carte.drawparallels(paralleles,
                                     labels = [False, True, True, False])
            # Liste des méridiens à afficher.
            meridiens = np.arange(0, 360, 30)
            self.carte.drawmeridians(meridiens,
                                     labels = [True, False, False, True])
     
            # Liaison de la zone de tracé.
            self.zoneTrace = FigureCanvas(self.figure)
            self.zoneTrace.setSizePolicy(QtGui.QSizePolicy.Expanding,
                                         QtGui.QSizePolicy.Expanding)
            self.zoneTrace.updateGeometry()
            # Outils de navigation.
            self.navigation = NavigationToolbar(self.zoneTrace, self)
            self.navigation.hide()
            # self.ui.gridLayout_3.addWidget(self.navigation)
            self.ui.gridLayout_3.addWidget(self.zoneTrace)
            parent.ui.gridLayout.addWidget(self.ui)
     
            # Selecteur de zone par rectangle.
            self.selecteurRectangle = RectangleSelector(self.axes,
                                                        self._selectionAppel,
                                                        drawtype = 'box',
                                                        useblit = True,
                                                        button = [1],
                                                            minspanx = 5,
                                                        minspany = 5,
                                                        spancoords = 'pixels')
            # self.zoneTrace.mpl_connect('key_press_event', self._basculeSelecteur)
            self._connecterActions()
     
        def __init__ (self, fichier, parent):
            """
            Constructeur (initialisateur) de la classe.
     
            :param fichier: Nom du fichier contenant la description QML de
                            l'interface
            :param parent: Pointeur vers l’objet parent dans l’interface (zone
                           centrale de la fenêtre principale.
            """
     
            super(ExtractData, self).__init__(parent)
     
            # Instance de l’interface du module.
            self.ui = uic.loadUi(fichier)
     
            self._definiInterface(parent)
     
            self.zoneTrace.draw()
    Fichier mainUi.ui :

    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
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
     
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <author>Yoann LE BARS</author>
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>1072</width>
        <height>822</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>Atelier SWEC</string>
      </property>
      <property name="locale">
       <locale language="French" country="France"/>
      </property>
      <widget class="QWidget" name="centralwidget">
       <widget class="QScrollArea" name="scrollArea">
        <property name="geometry">
         <rect>
          <x>-1</x>
          <y>-1</y>
          <width>211</width>
          <height>731</height>
         </rect>
        </property>
        <property name="widgetResizable">
         <bool>true</bool>
        </property>
        <widget class="QWidget" name="scrollAreaWidgetContents_3">
         <property name="geometry">
          <rect>
           <x>0</x>
           <y>0</y>
           <width>209</width>
           <height>729</height>
          </rect>
         </property>
         <layout class="QVBoxLayout" name="verticalLayout">
          <item>
           <widget class="QGroupBox" name="groupBox">
            <property name="title">
             <string>Données</string>
            </property>
            <widget class="QPushButton" name="extractData">
             <property name="geometry">
              <rect>
               <x>10</x>
               <y>20</y>
               <width>171</width>
               <height>23</height>
              </rect>
             </property>
             <property name="toolTip">
              <string>Lance l’outil de sélection des données à traiter.</string>
             </property>
             <property name="text">
              <string>Outil_extract_données</string>
             </property>
            </widget>
           </widget>
          </item>
         </layout>
        </widget>
       </widget>
       <widget class="QWidget" name="gridLayoutWidget">
        <property name="geometry">
         <rect>
          <x>219</x>
          <y>9</y>
          <width>661</width>
          <height>721</height>
         </rect>
        </property>
        <layout class="QGridLayout" name="gridLayout"/>
       </widget>
      </widget>
      <widget class="QMenuBar" name="menubar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>1072</width>
         <height>21</height>
        </rect>
       </property>
       <widget class="QMenu" name="menuFichier">
        <property name="title">
         <string>&amp;Fichier</string>
        </property>
        <addaction name="actionQuitter"/>
       </widget>
       <widget class="QMenu" name="menuEdition">
        <property name="title">
         <string>&amp;Edition</string>
        </property>
       </widget>
       <widget class="QMenu" name="menuAffichage">
        <property name="title">
         <string>&amp;Affichage</string>
        </property>
       </widget>
       <widget class="QMenu" name="menuOutils">
        <property name="title">
         <string>&amp;Outils</string>
        </property>
       </widget>
       <widget class="QMenu" name="menuA_ide">
        <property name="title">
         <string>A&amp;ide</string>
        </property>
        <addaction name="actionAProposSWEC"/>
        <addaction name="actionAProposQt"/>
       </widget>
       <addaction name="menuFichier"/>
       <addaction name="menuEdition"/>
       <addaction name="menuAffichage"/>
       <addaction name="menuOutils"/>
       <addaction name="menuA_ide"/>
      </widget>
      <widget class="QStatusBar" name="statusbar"/>
      <action name="actionQuitter">
       <property name="text">
        <string>&amp;Quitter</string>
       </property>
       <property name="toolTip">
        <string>Quitter</string>
       </property>
       <property name="shortcut">
        <string>Ctrl+Q</string>
       </property>
      </action>
      <action name="actionOuvrir">
       <property name="text">
        <string>&amp;Ouvrir</string>
       </property>
      </action>
      <action name="actionAgrandirImage">
       <property name="text">
        <string>&amp;Agrandir l'image</string>
       </property>
      </action>
      <action name="actionReduireImage">
       <property name="text">
        <string>&amp;Réduire l'image</string>
       </property>
      </action>
      <action name="actionTailleNormale">
       <property name="text">
        <string>Taille &amp;initiale</string>
       </property>
      </action>
      <action name="actionAProposSWEC">
       <property name="text">
        <string>À propos de l’atelier &amp;SWEC</string>
       </property>
      </action>
      <action name="actionAProposQt">
       <property name="text">
        <string>À propos de &amp;Qt</string>
       </property>
      </action>
     </widget>
     <resources/>
     <connections/>
    </ui>
    Fichier extractData.ui :

    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
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
     
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>Form</class>
     <widget class="QWidget" name="Form">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>400</width>
        <height>300</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>Form</string>
      </property>
      <layout class="QGridLayout" name="gridLayout">
       <item row="0" column="0">
        <widget class="QTabWidget" name="tabWidget">
         <property name="locale">
          <locale language="French" country="France"/>
         </property>
         <property name="currentIndex">
          <number>0</number>
         </property>
         <widget class="QWidget" name="tab_1">
          <attribute name="title">
           <string>Sélection de la zone</string>
          </attribute>
          <attribute name="toolTip">
           <string>Sélection de la zone géographique, de l’intervalle de temps et la mission à partir desquels importer les données.</string>
          </attribute>
          <layout class="QGridLayout" name="gridLayout_2">
           <item row="1" column="0">
            <layout class="QVBoxLayout" name="verticalLayout">
             <item>
              <layout class="QFormLayout" name="formLayout">
               <item row="0" column="0">
                <widget class="QLabel" name="label_3">
                 <property name="text">
                  <string>Mission :</string>
                 </property>
                </widget>
               </item>
               <item row="0" column="1">
                <widget class="QComboBox" name="choixMission">
                 <item>
                  <property name="text">
                   <string>CFOSAT</string>
                  </property>
                 </item>
                </widget>
               </item>
               <item row="1" column="0">
                <widget class="QLabel" name="label_4">
                 <property name="text">
                  <string>Instrument :</string>
                 </property>
                </widget>
               </item>
               <item row="1" column="1">
                <widget class="QComboBox" name="choixInstrument">
                 <item>
                  <property name="text">
                   <string>SWIM</string>
                  </property>
                 </item>
                </widget>
               </item>
               <item row="3" column="0">
                <widget class="QLabel" name="label">
                 <property name="text">
                  <string>Date de début :</string>
                 </property>
                </widget>
               </item>
               <item row="3" column="1">
                <widget class="QDateTimeEdit" name="dateTimeEdit">
                 <property name="displayFormat">
                  <string>d/MMM/yyyy h:mm</string>
                 </property>
                 <property name="calendarPopup">
                  <bool>true</bool>
                 </property>
                </widget>
               </item>
               <item row="4" column="0">
                <widget class="QLabel" name="label_2">
                 <property name="text">
                  <string>Date de fin :</string>
                 </property>
                </widget>
               </item>
               <item row="4" column="1">
                <widget class="QDateTimeEdit" name="dateTimeEdit_2">
                 <property name="displayFormat">
                  <string>d/MMM/yyyy h:mm</string>
                 </property>
                 <property name="calendarPopup">
                  <bool>true</bool>
                 </property>
                </widget>
               </item>
               <item row="2" column="0">
                <widget class="QLabel" name="label_5">
                 <property name="text">
                  <string>Niveau(x) :</string>
                 </property>
                </widget>
               </item>
               <item row="2" column="1">
                <widget class="QListWidget" name="listWidget">
                 <property name="selectionMode">
                  <enum>QAbstractItemView::MultiSelection</enum>
                 </property>
                 <item>
                  <property name="text">
                   <string>L0</string>
                  </property>
                 </item>
                 <item>
                  <property name="text">
                   <string>L1A</string>
                  </property>
                 </item>
                 <item>
                  <property name="text">
                   <string>L1B</string>
                  </property>
                 </item>
                 <item>
                  <property name="text">
                   <string>L2</string>
                  </property>
                 </item>
                </widget>
               </item>
              </layout>
             </item>
             <item>
              <widget class="QWidget" name="widget" native="true">
               <layout class="QGridLayout" name="gridLayout_4">
                <item row="0" column="1">
                 <widget class="QPushButton" name="boutonPrecedent">
                  <property name="text">
                   <string/>
                  </property>
                  <property name="icon">
                   <iconset>
                    <normaloff>../ressources/left-chevron.png</normaloff>../ressources/left-chevron.png</iconset>
                  </property>
                 </widget>
                </item>
                <item row="0" column="2">
                 <widget class="QPushButton" name="boutonSuivant">
                  <property name="text">
                   <string/>
                  </property>
                  <property name="icon">
                   <iconset>
                    <normaloff>../ressources/right-chevron.png</normaloff>../ressources/right-chevron.png</iconset>
                  </property>
                 </widget>
                </item>
                <item row="0" column="3">
                 <widget class="QPushButton" name="boutonDeplace">
                  <property name="text">
                   <string/>
                  </property>
                  <property name="icon">
                   <iconset>
                    <normaloff>../ressources/move-option.png</normaloff>../ressources/move-option.png</iconset>
                  </property>
                 </widget>
                </item>
                <item row="0" column="5">
                 <widget class="QPushButton" name="boutonSelection">
                  <property name="text">
                   <string/>
                  </property>
                  <property name="icon">
                   <iconset>
                    <normaloff>../ressources/select.png</normaloff>../ressources/select.png</iconset>
                  </property>
                 </widget>
                </item>
                <item row="0" column="4">
                 <widget class="QPushButton" name="boutonAgrandi">
                  <property name="text">
                   <string/>
                  </property>
                  <property name="icon">
                   <iconset>
                    <normaloff>../ressources/magnifier.png</normaloff>../ressources/magnifier.png</iconset>
                  </property>
                 </widget>
                </item>
                <item row="0" column="0">
                 <widget class="QPushButton" name="boutonInitial">
                  <property name="text">
                   <string/>
                  </property>
                  <property name="icon">
                   <iconset>
                    <normaloff>../ressources/home.png</normaloff>../ressources/home.png</iconset>
                  </property>
                 </widget>
                </item>
                <item row="1" column="0" colspan="6">
                 <layout class="QGridLayout" name="gridLayout_3"/>
                </item>
               </layout>
              </widget>
             </item>
            </layout>
           </item>
          </layout>
         </widget>
         <widget class="QWidget" name="tab_2">
          <attribute name="title">
           <string>Tab 2</string>
          </attribute>
         </widget>
        </widget>
       </item>
      </layout>
     </widget>
     <resources/>
     <connections/>
    </ui>
    Encore désolé de ne pas avoir trouvé un moyen de mieux isoler le problème. Si quelqu’un a une piste, je suis preneur parce que de mon côté les recherches sur le web n’ont rien donné.

    À bientôt.

    Le Farfadet Spatial

  2. #2
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    avril 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : avril 2008
    Messages : 179
    Points : 600
    Points
    600
    Par défaut
    Salut à tous !

    Bon, pour l’instant personne n’a pu proposer de réponse, mais il faut reconnaître que les codes que j’ai donnés étaient rebutant. Surtout, je m’y étais mal pris pour créer mon ECM. Là, j’ai fait bien mieux.

    L’erreur est la même :

    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
     
    Traceback (most recent call last):
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/backends/backend_qt5.py", line 338, in resizeEvent
        self.draw()
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/backends/backend_qt5agg.py", line 148, in draw
        FigureCanvasAgg.draw(self)
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/backends/backend_agg.py", line 469, in draw
        self.figure.draw(self.renderer)
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/artist.py", line 59, in draw_wrapper
        draw(artist, renderer, *args, **kwargs)
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/figure.py", line 1079, in draw
        func(*args)
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/artist.py", line 59, in draw_wrapper
        draw(artist, renderer, *args, **kwargs)
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/axes/_base.py", line 1988, in draw
        self.apply_aspect()
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/axes/_base.py", line 1180, in apply_aspect
        pb1 = pb.shrunk_to_aspect(box_aspect, pb, fig_aspect)
      File "/Produits/publics/x86_64.Linux.RH6/python/2.7.5b/lib/python2.7/site-packages/matplotlib-1.4.2-py2.7-linux-x86_64.egg/matplotlib/transforms.py", line 596, in shrunk_to_aspect
        assert box_aspect > 0 and fig_aspect > 0
    AssertionError
    En revanche, les codes sont plus courts. Tout d’abord, le fichier principal swec.py (celui à lancer) :

    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
     
    #!/usr/bin/env python2.7
    # -*- coding: utf-8 -*-
     
    """
    Fichier principal de l’atelier SWEC.
     
    :module: SWEC
    :author: Yoann LE BARS
    :version: 1.0
    :date: 21/07/2017
    :date: 24/07/2017
    :date: 26/07/2017
    :date: 27/07/2017
    :date: 31/07/2017
    :date: 01/08/2017
    :date: 02/08/2017
    :date: 03/08/2017
    :date: 04/08/2017
    :date: 09/08/2017
    :date: 10/08/2017
    :date: 16/08/2017
    :date: 17/08/2017
    :date: 18/08/2017
    :date: 21/08/2017
     
       Lance la structure de base de l’application.
     
    Python 2.7 : fonctionne
    Python 3 : non-testé
     
    Copyright 2017 CNES
     
        This program is free software: you can redistribute it and/or modify it
    under the terms of the GNU Lesser General Public License as published by the
    Free Software Foundation, either version 3 of the License, or (at your
    option) any later version.
        This program is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.
    """
     
    from PyQt4 import QtCore, QtGui, uic
    import extractData
     
    class MainWindow (QtGui.QMainWindow):
        """
        Classe principale de l’application.
        """
     
        def __init__ (self, fichier, fichierInterfaceExtractData, parent = None):
            """
            Constructeur (initialisateur) de la classe.
     
            :param fichier: Nom du fichier contenant la description QML de
                            l’interface
            :param fichierInterfaceExtractData: Nom du fichier contenant la
                                                description QML de l'interface
                                                d'extractData.
            :param parent: Pointeur vers une éventuelle classe parente.
            """
     
            super(MainWindow, self).__init__(parent)
            # Instance de l'interface de l'atelier.
            self.ui = uic.loadUi(fichier)
     
            # Message indiquant l'état de l'application.
            message = QtCore.QCoreApplication.translate('MainWindow',
                                                        u'Initialisation.')
            self.ui.statusbar.showMessage(message)
            self.ui.show()
     
            # Message indiquant qu'une opération a été réalisée.
            self.fini = QtCore.QCoreApplication.translate('MainWindow', u'Fini.')
     
            # Instance de l’interface pour l'extraction de données.
            self.extractData =\
                extractData.ExtractData(fichierInterfaceExtractData, self)
     
            message = QtCore.QCoreApplication.translate('MainWindow', u'Prêt.')
            self.ui.statusbar.showMessage(message)
     
    def main ():
        """
        Fonction principale du programme.
        :return: 0 si tout s’est déroulé convenablement, code d’erreur sinon.
        """
     
        import sys
        import argparse
     
        # Analyseur de la ligne de commande.
        analyseur = argparse.ArgumentParser(description=u"L’atelier SWEC est "
                                                        u"une interface "
                                                        u"graphique pour gérer "
                                                        u"les données générées "
                                                        u"par la mission "
                                                        u"satellite SWIM.")
        analyseur.add_argument("-v", "--version", action = "store_true",
                               help = u"Indique la version du programme.")
        # Arguments de la ligne de commande.
        arguments = analyseur.parse_args()
     
        if arguments.version:
            print("1.0")
            return 0
        else:
            # Instance de l'application.
            app = QtGui.QApplication(sys.argv)
            # Instance de la fenêtre principale.
            mainWindow = MainWindow('mainUi.ui', 'extractData.ui')
            return app.exec_()
     
    if __name__ == '__main__':
        main()
    Le fichier extractData.py :

    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
     
    # -*- coding: utf-8 -*-
     
    """
    Extraction des données depuis une collection de fichiers.
     
    :module: extractData
    :author: Yoann LE BARS
    :version: 1.0
    :date: 10/08/2017
    :date: 16/08/2017
    :date: 17/08/2017
    :date: 21/08/2017
    :date: 22/08/2017
     
    Python 2.7 : fonctionne
    Python 3 : non-testé
     
    Copyright 2017 CNES
     
        This program is free software: you can redistribute it and/or modify it
    under the terms of the GNU Lesser General Public License as published by the
    Free Software Foundation, either version 3 of the License, or (at your
    option) any later version.
        This program is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.
    """
     
    from PyQt4 import QtCore, QtGui, uic
    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.backends.backend_qt4 import NavigationToolbar2QT as NavigationToolbar
    from matplotlib.widgets import RectangleSelector
    import numpy as np
     
    class ExtractData (QtGui.QWidget):
        """
        Classe principale pour l’extraction des données.
        """
     
        def _definiInterface (self, parent):
            """
            Mise en place de l'interface de l’outil de sélection.
     
            :param parent: Pointeur vers le widget parent.
            """
     
            self.ui.tabWidget.setCurrentIndex(0)
     
            # Zone où tracer la carte.
            self.figure, self.axes = plt.subplots()
     
            # Carte en projection orthonormale.
            self.carte = Basemap(projection = 'gall', llcrnrlat = -90,
                                 urcrnrlat = 90, llcrnrlon = -180,
                                 urcrnrlon = 180, resolution = 'c',
                                 ax = self.axes)
            self.carte.drawcoastlines(linewidth = 0.25)
            self.carte.fillcontinents(color = 'coral', lake_color = 'aqua')
            self.carte.drawmapboundary(fill_color = 'aqua')
            # Liste des parallèles à afficher.
            paralleles = np.arange(-90, 90, 30)
            self.carte.drawparallels(paralleles,
                                     labels = [False, True, True, False])
            # Liste des méridiens à afficher.
            meridiens = np.arange(0, 360, 30)
            self.carte.drawmeridians(meridiens,
                                     labels = [True, False, False, True])
     
            # Liaison de la zone de tracé.
            self.zoneTrace = FigureCanvas(self.figure)
            self.zoneTrace.setSizePolicy(QtGui.QSizePolicy.Expanding,
                                         QtGui.QSizePolicy.Expanding)
            self.zoneTrace.updateGeometry()
            self.ui.gridLayout_3.addWidget(self.zoneTrace)
            parent.ui.gridLayout.addWidget(self.ui)
     
        def __init__ (self, fichier, parent):
            """
            Constructeur (initialisateur) de la classe.
     
            :param fichier: Nom du fichier contenant la description QML de
                            l'interface
            :param parent: Pointeur vers l’objet parent dans l’interface (zone
                           centrale de la fenêtre principale.
            """
     
            # Zone de message de l'application.
            self.barreDeStatus = parent.ui.statusbar
     
            # Message indiquant l'état de l'application.
            message = QtCore.QCoreApplication.translate('ExtractData',
                                                        u'Initialisation du '
                                                        u'module ExtractData.')
            self.barreDeStatus.showMessage(message)
     
            super(ExtractData, self).__init__(parent)
     
            # Instance de l’interface du module.
            self.ui = uic.loadUi(fichier)
     
            self._definiInterface(parent)
     
            # Format pour l'écriture des dates.
            self.format = "yyyy/MM/dd HH:mm:ss"
            # Indique si une sélection géographique a été réalisée.
            self.geographie = False
     
            self.zoneTrace.draw()
     
            # Message indiquant qu'une opération a été réalisée.
            self.fini = parent.fini
            self.barreDeStatus.showMessage(self.fini)
    Le fichier maiUi.ui :

    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
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
     
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <author>Yoann LE BARS</author>
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>1072</width>
        <height>822</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>Atelier SWEC</string>
      </property>
      <property name="locale">
       <locale language="French" country="France"/>
      </property>
      <widget class="QWidget" name="centralwidget">
       <widget class="QScrollArea" name="scrollArea">
        <property name="geometry">
         <rect>
          <x>-1</x>
          <y>-1</y>
          <width>211</width>
          <height>731</height>
         </rect>
        </property>
        <property name="widgetResizable">
         <bool>true</bool>
        </property>
        <widget class="QWidget" name="scrollAreaWidgetContents_3">
         <property name="geometry">
          <rect>
           <x>0</x>
           <y>0</y>
           <width>209</width>
           <height>729</height>
          </rect>
         </property>
         <layout class="QVBoxLayout" name="verticalLayout">
          <item>
           <widget class="QGroupBox" name="groupBox">
            <property name="title">
             <string>Données</string>
            </property>
           </widget>
          </item>
         </layout>
        </widget>
       </widget>
       <widget class="QWidget" name="gridLayoutWidget">
        <property name="geometry">
         <rect>
          <x>219</x>
          <y>9</y>
          <width>661</width>
          <height>721</height>
         </rect>
        </property>
        <layout class="QGridLayout" name="gridLayout"/>
       </widget>
      </widget>
      <widget class="QMenuBar" name="menubar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>1072</width>
         <height>21</height>
        </rect>
       </property>
       <widget class="QMenu" name="menuFichier">
        <property name="title">
         <string>&amp;Fichier</string>
        </property>
       </widget>
       <widget class="QMenu" name="menuEdition">
        <property name="title">
         <string>&amp;Edition</string>
        </property>
       </widget>
       <widget class="QMenu" name="menuAffichage">
        <property name="title">
         <string>&amp;Affichage</string>
        </property>
       </widget>
       <widget class="QMenu" name="menuOutils">
        <property name="title">
         <string>&amp;Outils</string>
        </property>
       </widget>
       <widget class="QMenu" name="menuA_ide">
        <property name="title">
         <string>A&amp;ide</string>
        </property>
       </widget>
       <addaction name="menuFichier"/>
       <addaction name="menuEdition"/>
       <addaction name="menuAffichage"/>
       <addaction name="menuOutils"/>
       <addaction name="menuA_ide"/>
      </widget>
      <widget class="QStatusBar" name="statusbar"/>
      <action name="actionQuitter">
       <property name="text">
        <string>&amp;Quitter</string>
       </property>
       <property name="toolTip">
        <string>Quitter</string>
       </property>
       <property name="shortcut">
        <string>Ctrl+Q</string>
       </property>
      </action>
      <action name="actionOuvrir">
       <property name="text">
        <string>&amp;Ouvrir</string>
       </property>
      </action>
      <action name="actionAgrandirImage">
       <property name="text">
        <string>&amp;Agrandir l'image</string>
       </property>
      </action>
      <action name="actionReduireImage">
       <property name="text">
        <string>&amp;Réduire l'image</string>
       </property>
      </action>
      <action name="actionTailleNormale">
       <property name="text">
        <string>Taille &amp;initiale</string>
       </property>
      </action>
      <action name="actionAProposSWEC">
       <property name="text">
        <string>À propos de l’atelier &amp;SWEC</string>
       </property>
      </action>
      <action name="actionAProposQt">
       <property name="text">
        <string>À propos de &amp;Qt</string>
       </property>
      </action>
     </widget>
     <resources/>
     <connections/>
    </ui>
    Et enfin le fichier extractData.ui :

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>Form</class>
     <widget class="QWidget" name="Form">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>400</width>
        <height>320</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>Form</string>
      </property>
      <layout class="QGridLayout" name="gridLayout">
       <item row="0" column="0">
        <widget class="QTabWidget" name="tabWidget">
         <property name="locale">
          <locale language="French" country="France"/>
         </property>
         <property name="currentIndex">
          <number>0</number>
         </property>
         <widget class="QWidget" name="tab_1">
          <attribute name="title">
           <string>Sélection de la zone</string>
          </attribute>
          <attribute name="toolTip">
           <string>Sélection de la zone géographique, de l’intervalle de temps et la mission à partir desquels importer les données.</string>
          </attribute>
          <layout class="QGridLayout" name="gridLayout_2">
           <item row="1" column="0">
            <layout class="QVBoxLayout" name="verticalLayout">
             <item>
              <layout class="QFormLayout" name="formLayout">
               <item row="0" column="0">
                <widget class="QLabel" name="label_3">
                 <property name="text">
                  <string>Mission :</string>
                 </property>
                </widget>
               </item>
               <item row="0" column="1">
                <widget class="QComboBox" name="choixMission">
                 <item>
                  <property name="text">
                   <string>CFOSAT</string>
                  </property>
                 </item>
                </widget>
               </item>
              </layout>
             </item>
             <item>
              <widget class="QWidget" name="widget" native="true">
               <layout class="QGridLayout" name="gridLayout_4">
                <item row="0" column="0" colspan="2">
                 <layout class="QGridLayout" name="gridLayout_3"/>
                </item>
               </layout>
              </widget>
             </item>
            </layout>
           </item>
          </layout>
         </widget>
         <widget class="QWidget" name="tab_2">
          <attribute name="title">
           <string>Sélection des champs</string>
          </attribute>
          <attribute name="toolTip">
           <string>Sélection des champs dans les fichiers de données.</string>
          </attribute>
         </widget>
        </widget>
       </item>
      </layout>
     </widget>
     <resources/>
     <connections/>
    </ui>
    Voilà, en espérant que ça aidera à m’aider !

    À bientôt.

    Le Farfadet Spatial

  3. #3
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    avril 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : avril 2008
    Messages : 179
    Points : 600
    Points
    600
    Par défaut
    Salut à tous !

    Bon, si je n’ai pas de réponse c’est probablement parce que personne n’a d’idée, mais au cas où j’essaye une ultime relance : quelqu’un aurait-il une idée ?

    À bientôt.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    novembre 2010
    Messages
    2 998
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : novembre 2010
    Messages : 2 998
    Points : 8 306
    Points
    8 306
    Par défaut
    salut,

    histoire que tu te sentes pas trop seul, et uniquement ça parce qu'en réalité je suis pas en mesure de t'aider, on trouve des trucs assez ressemblants en cherchant un peu
    il y a malgré tout très peu de résultats liés à la une erreur similaire et encore moins de réponses au problème, seul ce lien parle vaguement d'une race condition quelconque (on est bien avancé )
    https://github.com/scikit-image/scik...ge/issues/2094

    ps: si t'arrive à réduire le code à quelques lignes minimales pour le reproduire tu peux toujours tenter de remonter le bug

  5. #5
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    avril 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : avril 2008
    Messages : 179
    Points : 600
    Points
    600
    Par défaut
    Salut à tous !

    Merci BufferBob pour le soutien – qui, à l’aune des difficultés que j’ai rencontrées dans mes recherches, a dû prendre du temps !

    Citation Envoyé par BufferBob Voir le message
    il y a malgré tout très peu de résultats liés à la une erreur similaire et encore moins de réponses au problème, seul ce lien parle vaguement d'une race condition quelconque (on est bien avancé )
    https://github.com/scikit-image/scik...ge/issues/2094
    C’est en effet le genre de choses sur lequel je suis tombé.

    ps: si t'arrive à réduire le code à quelques lignes minimales pour le reproduire tu peux toujours tenter de remonter le bug
    Clairement, il faudrait que je sois en mesure de réduire le code à moins de lignes. Pour l’instant, je n’y arrive pas et c’est sans doute révélateur du fait que je ne comprends pas bien le bogue. Pour l’instant, je ne suis pas certain que ce soit un problème chez Basemap.

    À bientôt.

    Le Farfadet Spatial

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 18 646
    Points : 32 194
    Points
    32 194
    Par défaut
    Citation Envoyé par Le Farfadet Spatial Voir le message
    Clairement, il faudrait que je sois en mesure de réduire le code à moins de lignes. Pour l’instant, je n’y arrive pas et c’est sans doute révélateur du fait que je ne comprends pas bien le bogue. Pour l’instant, je ne suis pas certain que ce soit un problème chez Basemap.
    Si vous ne savez pas réduire le problème, vous savez le reproduire "à volonté".
    De ce fait comme le code des bibliothèques est disponible, vous pouvez poser construire une théorie sur ce que fait/devrait faire le code et valider ce qu'il fait avec des "print" bien placés ou en posant des breakpoints et en examinant le contenu de variables.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    avril 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : avril 2008
    Messages : 179
    Points : 600
    Points
    600
    Par défaut
    Salut à tous !

    Merci pour le message Wiztricks.

    Citation Envoyé par wiztricks Voir le message
    De ce fait comme le code des bibliothèques est disponible, vous pouvez poser construire une théorie sur ce que fait/devrait faire le code
    Le fait est que, par ailleurs, le code fonctionne comme attendu. En fait, en dépit du message d’erreur, le programme continu de fonctionner et il donne entière satisfaction. Ce qui rend d’autant plus difficile la recherche du problème.

    Cependant, il me semble qu’il y a au moins deux bonnes raisons pour faire en sorte que le message disparaisse. D’une part, ça pollue la sortie d’erreur de telle sorte que si d’autres erreurs devaient avoir lieu, ce serait plus difficile de retrouver l’information. D’autre part, ça peut être le symptôme d’un problème qui pourrait devenir bloquant plus tard.

    valider ce qu'il fait avec des "print" bien placés ou en posant des breakpoints et en examinant le contenu de variables.
    Ce qui ressort de les pas à pas, c’est que le problème se déclenche à la fin de l’initialisation (méthode « __init__ ») de « MainWindow », c’est-à-dire dans la fonction « main » entre l’instanciation de « mainWindow » (ligne 112 du fichier « swec.py ») et le lancement de la boucle d’exécution (ligne 113 du fichier « swec.py »). En revanche, il est bien allé au bout de la méthode « __init__ », la dernière ligne en est exécutée avant l’apparition du message d’erreur.

    À bientôt.

    Le Farfadet Spatial

  8. #8
    Membre confirmé
    Avatar de Le Farfadet Spatial
    Homme Profil pro
    En cours de précision…
    Inscrit en
    avril 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En cours de précision…

    Informations forums :
    Inscription : avril 2008
    Messages : 179
    Points : 600
    Points
    600
    Par défaut
    Salut à tous !

    Bon, j’ai fini par trouver une solution : j’ai pu passer à une version un peu plus récente de Basemap, certes toujours ancienne mais moins qu’avant et ça a corrigé le problème. Cela venait donc de la bibliothèque. Problème résolu.

    À bientôt.

    Le Farfadet Spatial

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

Discussions similaires

  1. [QtGui] [PyQt GUI] canvas matplotlib
    Par jiepsan dans le forum PyQt
    Réponses: 0
    Dernier message: 09/12/2016, 18h39
  2. cx_Freeze, PyQt et matplotlib
    Par chticricri dans le forum Déploiement/Installation
    Réponses: 2
    Dernier message: 30/01/2013, 15h46
  3. Réponses: 4
    Dernier message: 03/10/2010, 12h30
  4. Erreur Matplotlib Basemap
    Par jouclar dans le forum Calcul scientifique
    Réponses: 8
    Dernier message: 01/06/2010, 20h41
  5. [PyQt] [py2exe]
    Par Zorro dans le forum Py2exe
    Réponses: 2
    Dernier message: 05/05/2006, 14h36

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