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 :

QMessageBox/QFileDialog- crash inexpliqués


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut QMessageBox/QFileDialog- crash inexpliqués
    Bonjour,

    Je me lance dans la programmation d'interface avec pyQt et je rencontre un souci avec un code qui ne fonctionne pas.

    Voilà une version simplifiée qui reproduit le problè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
    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
    import sys
    from PyQt5 import QtCore, QtWidgets
    from PyQt5.QtWidgets import QMainWindow, QLabel, QGridLayout, QWidget
    from PyQt5.QtCore import QSize    
     
    from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication
    from PyQt5.QtGui import QIcon
    from PyQt5.QtWidgets import QFileDialog
     
    class HelloWindow(QMainWindow):
        def __init__(self):
            QMainWindow.__init__(self)
     
            self.setMinimumSize(QSize(640, 480))    
            self.setWindowTitle("Hello world") 
     
            centralWidget = QWidget(self)          
            self.setCentralWidget(centralWidget)   
     
            gridLayout = QGridLayout(self)     
            centralWidget.setLayout(gridLayout)  
     
            title = QLabel("Hello World from PyQt", self) 
            title.setAlignment(QtCore.Qt.AlignCenter) 
            gridLayout.addWidget(title, 0, 0)
     
            # menu
            exportAct = QAction('&Select fichier', self)        
            exportAct.triggered.connect(self.export)
     
            aproposAct = QAction('&A propos', self)        
            aproposAct.triggered.connect(self.apropos)
     
            menubar = self.menuBar()
            fileMenu = menubar.addMenu('&Fichier')
            fileMenu.addAction(exportAct)
            fileMenu.addAction(aproposAct)
     
        def export(self):
            options = QFileDialog.Options()
            options |= QFileDialog.DontUseNativeDialog
            fileName, _ = QFileDialog.getSaveFileName(self,"Enregistrer sous ...","","All Files (*);;Text Files (*.txt)", options=options)
            #filename=filename+".csv"
            if fileName:
                print(filename)
                #print("Création de " + fileName)
     
        def apropos(self):
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Information)
     
            msg.setText("Test")
            msg.setInformativeText("This is additional information")
            msg.setWindowTitle("MessageBox demo")
            msg.setDetailedText("The details are as follows:")
            msg.setStandardButtons(QMessageBox.Ok)
     
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        mainWin = HelloWindow()
        mainWin.show()
        sys.exit( app.exec_() )
    le programme se lance bien, par contre :
    - si je lance le menu "A propos", je plante
    - si je lance la sélection d'un chemin, la fenêtre s'ouvre puis une fois le dossier sélectionné et le nom donné, le programme se ferme complètement

    Je me suis fortement inspirer d'exemples trouvés sur internet mais là je bloque vraiment, si quelqu'un a une idée de l'erreur, je le remercie

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour l'action "à propos" => ligne 49: QMessageBox n'a pas été déclaré dans les importations (module QtWidgets)

    Pour l'action "fichier" => ligne 45: filename non déclaré (il faut fileName)

    En fait, tu as besoin d'un mécanisme d'affichage des erreurs. Voilà comment moi, je fais:

    Je fabrique un fichier msgerreur.py que je place dans le même répertoire que le fichier à tester, et qui contient:

    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # Python 3
     
    from PyQt5.QtCore import (QtDebugMsg, QtInfoMsg, QtWarningMsg, QtCriticalMsg, 
                        QtFatalMsg, QtSystemMsg)
    from PyQt5.QtWidgets import QMessageBox
     
    #############################################################################
    def messagederreur(typerr, contexte, msgerr):
        """Permet d'afficher et/ou de neutraliser les messages d'erreur.
           Pour les messages critiques: affiche dans une fenêtre graphique.
           Mise en place par: QtCore.qInstallMessageHandler(messagederreur)
        """
        if typerr==QtDebugMsg:
            # exemple de désactivation d'un message
            #if "QWindowsFileSystemWatcherEngine: unknown message" in msgerr:
            #    return 
            print("DEBUG:\n{}\n".format(msgerr))
     
        elif typerr==QtWarningMsg:
            # exemple de désactivation d'un message
            #if "QFont::setPixelSize: Pixel size <= 0 (0)" in msgerr:
            #    return
            print("WARNING:\n{}\n".format(msgerr))
     
        elif typerr in [QtCriticalMsg, QtFatalMsg, QtSystemMsg]:    
            print("ERREUR CRITIQUE:\n{}\n".format(msgerr))
            QMessageBox.critical(None, 
                "ERREUR CRITIQUE:",
                "{}\n".format(msgerr))
        else:
            # message retourné par QtCore.QtInfoMsg créé à partir de Qt 5.5
            print("INFO:\n{}\n".format(msgerr))
    Et dans le code à tester, je mets juste après l'initialisation de la bibliothèque graphique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        from msgerreur import messagederreur  
        qInstallMessageHandler(messagederreur)
    Il faut, bien sûr, ajouter qInstallMessageHandler dans les importations du module QtCore.

    A chaque erreur, une fenêtre graphique apparaitra pour signaler l'erreur. On évitera ainsi l'évènement désagréable que constitue un beau plantage du programme sans aucun message...

  3. #3
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 51
    Par défaut
    merci beaucoup pour cette réponse,
    les erreurs n'étaient pas si importantes que ça mais il fallait les trouver

    merci pour le module message d'erreur, ça m'a permis de mettre en évidence le souci du filname

    par contre, par la suite la fonction apropos a continué à ne pas fonctionner malgré l'import de QMessagebox, j'ai finalement trouvé qu'il me manquait la ligne suivante pour lancer l'ouverture de la boite de dialogue


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

Discussions similaires

  1. [Windows] Crash lors de l'utilisation de QFileDialog
    Par Xarik dans le forum Débuter
    Réponses: 2
    Dernier message: 24/09/2012, 12h19
  2. [KDE] Crash de QFileDialog
    Par ahoff dans le forum Plateformes
    Réponses: 4
    Dernier message: 17/01/2012, 12h55
  3. [IB6] mon serveur crash apres des insert en série...
    Par Rmotte dans le forum Débuter
    Réponses: 11
    Dernier message: 27/05/2004, 14h53
  4. DLL Borland chargée par Windows: crash
    Par bocher dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/01/2004, 12h09
  5. Crash Base Access
    Par Ronald G. dans le forum Access
    Réponses: 4
    Dernier message: 04/08/2003, 11h55

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