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 :

[QFileDialog] getExistingDirectory et bouton Cancel


Sujet :

PyQt Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Points : 185
    Points
    185
    Par défaut [QFileDialog] getExistingDirectory et bouton Cancel
    Bonjour,
    je suis confronté à un problème avec une selection de dossier.
    j'utilise le code suivant pour avoir une liste de fichier contenu dans un dossier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            fileDialog = QtGui.QFileDialog
            self.projet = QtCore.QDir(fileDialog.getExistingDirectory(None,"Ouverture projet",))
            for i in self.projet.entryList():
                print i
    Mon problème est que si je clique sur Cancel, je n'ai pas une liste vide, mais j'ai la liste des fichiers dans le repertoire dans lequel est lancé mon script.

    Je ne sais pas comment différentier un clic sur le bouton cancel ou le bouton open.

    si quelqu'un a une idée, je suis preneur

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ce que renvoie getExistingDirectory n'est pas un QDir, mais un QString.

    Voilà un petit exemple d'utilisation:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 2.7
     
    import sys
    from PyQt4 import QtCore, QtGui
     
    class Fenetre(QtGui.QWidget):
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
     
            self.projet = unicode(QtGui.QFileDialog.getExistingDirectory(self, 
                         u"Ouverture projet",
                         u".",
                         QtGui.QFileDialog.ShowDirsOnly))
     
            if self.projet!=u"":
                QtGui.QMessageBox.information(self,
                    u"Ouverture projet",
                    u"projet sélectionné: %s" % (self.projet,))
            else:
                QtGui.QMessageBox.information(self,
                    u"Ouverture projet",
                    u"aucun projet sélectionné")
     
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    [Edit] J'en profite pour ajouter une solution à un problème qui m'a longtemps irrité: sous Windows 7, PyQt4 utilise par défaut la boite de dialogue native de Windows. Mais celle-ci a un inconvénient: une fois la sélection faite, il faut attendre environ 15 secondes pour que le programme se poursuive, et on ne comprend pas pourquoi. Certains parlent de bug (de Windows, Qt4 ou PyQt4?).

    En tout cas, il y a une solution: utiliser les fenêtres de dialogue de Qt4, avec l'option "QtGui.QFileDialog.DontUseNativeDialog". Bien sûr, dans ce cas, il faut assurer la traduction à la locale (français sur un PC français). Voilà le code ci-dessus modifié:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python 2.7
     
    import sys
    from PyQt4 import QtCore, QtGui
     
    class Fenetre(QtGui.QWidget):
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
     
            self.projet = unicode(QtGui.QFileDialog.getExistingDirectory(self, 
                         u"Ouverture projet",
                         u".",
                         QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog))
     
            if self.projet!=u"":
                QtGui.QMessageBox.information(self,
                    u"Ouverture projet",
                    u"projet sélectionné: %s" % (self.projet,))
            else:
                QtGui.QMessageBox.information(self,
                    u"Ouverture projet",
                    u"aucun projet sélectionné")
     
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
     
        # pour assurer la traduction automatique du conversationnel à la locale
        locale = QtCore.QLocale.system().name()
        translator = QtCore.QTranslator ()
        translationpath = unicode(QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath))
        translator.load(u"qt_" + locale[:2], translationpath)  
        app.installTranslator(translator)
     
        # application du style à la fenêtre
        style = u"Plastique"
        app.setStyle(QtGui.QStyleFactory.create(style))
        app.setPalette(QtGui.QApplication.style().standardPalette())
     
        # initialisation et affichage de la fenêtre
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Points : 185
    Points
    185
    Par défaut
    Merci beaucoup pour cette réponse.
    Je vais pouvoir tester le contenu de self.projet, et s'il est vide, je saurais que cancel a été cliqué.

    par contre, je ne comprend pas pourquoi ça ne fonctionne pas comme je l'avais fait. parceque du coup, je créé un objet QDir à partir de ce QString, non ? donc si le dialogue ne renvoit rien à cause du "cancel", je ne comprend pas pourquoi le QDir prend quand même une valeur... au pire, il devrait me faire une erreur, non ?

    merci également pour cette histoire de bug sur windows, je développe sous linux, et n'avait donc pas encore testé sous windows...

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par gregory2526 Voir le message
    par contre, je ne comprend pas pourquoi ça ne fonctionne pas comme je l'avais fait. parceque du coup, je créé un objet QDir à partir de ce QString, non ? donc si le dialogue ne renvoit rien à cause du "cancel", je ne comprend pas pourquoi le QDir prend quand même une valeur... au pire, il devrait me faire une erreur, non ?
    Il ne faut pas raisonner comme ça. Si le manuel dit que getExistingDirectory renvoie un QString, c'est un QString, ce n'est pas un QDir. Tu veux le résultat d'un getExistingDirectory, et tu utilises pour le recevoir une classe QDir qui a AUSSI un accès direct au disque: c'est normal que ça ne marche pas correctement. Le seul point curieux, c'est que ça ne renvoie pas une erreur.

    Je te suggère de coder avec le manuel en permanence à l'écran: on gagne un temps fou! Et pour ma part, je ne saurais pas faire autrement .
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Points : 185
    Points
    185
    Par défaut
    Merci.
    C'est un bon conseil...

    Je pense effectivement que de ne pas avoir de message d'erreur m'a conduit sur la mauvaise voie...

    Je met en résolu.

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

Discussions similaires

  1. bouton cancel en asp.net
    Par alicia26 dans le forum ASP.NET
    Réponses: 10
    Dernier message: 30/05/2007, 12h59
  2. Utiliser un bouton Cancel
    Par mimic50 dans le forum MFC
    Réponses: 3
    Dernier message: 31/08/2006, 22h33
  3. Boutons "Cancel" et "Continue"
    Par Romain93 dans le forum JSF
    Réponses: 2
    Dernier message: 25/07/2006, 14h45
  4. bouton cancel frame
    Par lazzeroni dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 16/05/2006, 08h41
  5. [JFrame] Boite de dialogue d'entrée de texte et bouton Cancel
    Par tooney dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 29/05/2005, 16h42

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