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

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

PyQt Python Discussion :

Afficher Progressdialog puis MsgBox dans une application graphique


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut Afficher Progressdialog puis MsgBox dans une application graphique
    Bonjour,
    Voici mon problème : j'ai créé une application graphique sous forme d'une fenêtre principale de type dialogue où l'utilisateur coche des options. Lorsque l'on clique sur sur OK, on lance une classe Progressdialog chargée du traitement (long!) des fichiers. Je voudrais, lorsque le traitement est terminé afficher un message pour informer du résultat.
    Mais ce messagebox ne s'affiche qu'une fraction de seconde et l'application se ferme.
    Comment faire pour qu'il reste affiché avant de valider la sortie.
    Je pense que le problème vient de ce que je suis obligé(?) d'appeler QtGui.QApplication.quit() avant de lancer la progressdialog.

    J'ai lu le très bon tuto de Tyrtamos mais cela concerne l'utilisation de thread qui ne m'est pas familière et une progressbar, or je souhaiterais une progressdialog.

    Ci-joint les fractions de code pertinentes :

    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
    class Ui_Dialog(object):
     
     
        def setupUi(self, Dialog):
            Dialog.setObjectName(_fromUtf8("Dialog"))
            Dialog.resize(600, 500)
            Dialog.setWindowTitle(_fromUtf8("PersonnaLiseur V 0.1"))
            Dialog.setStatusTip(_fromUtf8(""))
            Dialog.setAccessibleName(_fromUtf8(""))
            Dialog.setAccessibleDescription(_fromUtf8(""))
    /.../
    #slot de dialogue accepté:
                QtGui.QApplication.quit()
                job.ProgressDialog(bookdb, self.options_texte, nb)
                msg = QtGui.QMessageBox(QtGui.QMessageBox.Warning, 'Certains fichiers n\'ont pu être traités', 'Consultez le fichier', \
                                         QtGui.QMessageBox.Ok)
                msg.setWindowModality(QtCore.Qt.ApplicationModal)
                msg.exec_()
     
    /.../
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        ui = Ui_Dialog()
        Main = QtGui.QDialog()
        ui.setupUi(Main)
        Main.show()
        sys.exit(app.exec_())
    et ma classe progressdialog:
    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
    class ProgressDialog(QProgressDialog):
     
        def __init__(self, bookdb, options_texte, nb):
            QProgressDialog.__init__(self, None, None, 0, nb)
            self.setWindowTitle('Traitement des fichiers')
            self.nb = nb
            self.badbook = []
            self.setMinimum(0)
            self.setMaximum(self.nb)
            self.setMinimumWidth(500)
            QTimer.singleShot(0, self.sauvegarde)
            self.exec_()
            self.distribujob(options_texte, nb) #traitement des fichiers
    /.../
     def do_close(self, nb, texte):
            # shutil.rmtree(os.path.join(LECHEMIN + '/tmp'), ignore_errors=True)
            self.setValue(nb)
            self.hide()
            return

  2. #2
    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
    Salut,

    C'est un drôle de montage ton code.

    Qu'est-ce que c'est que ce job qui aurait la classe ProgressDialog en attribut ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                job.ProgressDialog(bookdb, self.options_texte, nb)
    Tu ne voulais pas plutôt faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                job = ProgressDialog(bookdb, self.options_texte, nb)
    D'autre part, une boîte de dialogue dont on ne conserve pas de référence se ferme aussitôt créée. Problème classique.

    Le QtGui.QApplication.quit() on se demande ce qu'il fout là, lui.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut
    Pardon, j'aurais dû préciser que job.py est le nom du module dans lequel s'initialise la classe ProgressDialog, comme cité en 2e.
    Quant à QtGui.QApplication.quit(), je sens bien que c'est là le problème, mais rien d'autre ne marche (Main.hide(), close()) et si je ne le mets pas tout se bloque.

  4. #4
    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,

    On sent qu'il y a un problème d'architecture du code, mais il est difficile de comprendre où, avec les morceaux de code présentés. Il serait intéressant de faire un code minimum qui a le problème, mais suffisamment complet pour qu'on puisse l'exécuter.

    Voilà un petit exemple vite fait:

    Je me sers du fichier exemple donné avec PyQt4, qui s'appelle "findfiles", et qui contient une fenêtre héritée de QtGui.QDialog pour rechercher des fichiers. Je l'ai recopié sans modification dans un répertoire de test, dans lequel j'ai fait le petit code suivant: une simple fenêtre avec un bouton. Quand on clique sur le bouton, on appelle la fenêtre de recherche de fichiers. A la fermeture de cette fenêtre, un message de warning est émis.

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    #Python 2.7
     
    import sys, os
    from PyQt4 import QtCore, QtGui
    from findfiles import Window
     
    #############################################################################
    class Fenetre(QtGui.QWidget):
     
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
            self.resize(300, 300)
     
            self.bouton = QtGui.QPushButton("cliquez!", self)
            self.bouton.setFixedSize(100, 100)
            self.bouton.clicked.connect(self.boutonclic)
     
            posit = QtGui.QGridLayout()
            posit.addWidget(self.bouton, 0, 0)
            self.setLayout(posit)
     
        def boutonclic(self):
     
            window = Window()
            window.exec_()
     
            msg = QtGui.QMessageBox.warning(self, 
                u"Attention!", 
                u"Certains fichiers n'ont pu être traités\nConsultez le fichier")
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Essaie de faire fonctionner ce petit code, et regarde si tu peux le modifier pour coller avec ton problème.

    Si le QMessageBox affiché devait dépendre du résultat de la fenêtre héritant de QDialog, il faudrait que celle-ci envoie un message de résultat (avec emit) à sa fermeture (closeEvent).

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 6
    Par défaut
    Finalement avec votre aide ceci fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #slot de sortie
               jobPD = job.ProgressDialog(bookdb, self.options_texte, nb)
                msg = QtGui.QMessageBox(QtGui.QMessageBox.Warning, 'Certains fichiers n\'ont pu être traités', 'Consultez le fichier', \
                                         QtGui.QMessageBox.Ok)
                msg.exec_()
                QtGui.QApplication.quit()
    Le 'problème' qui paraissait tout bloquer venait d'un défaut de mise à jour de la ProgressDialog.
    Un fichier de logging m'a permis de vérifier que toutes les étapes étaient réalisées.

    Merci à vous deux.

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/03/2014, 18h45
  2. Chargement d'image dans une application graphique
    Par chocoboy dans le forum Langage
    Réponses: 2
    Dernier message: 26/10/2006, 21h29
  3. Console dans une application graphique (Win32)
    Par KiriKoo dans le forum Qt
    Réponses: 2
    Dernier message: 23/10/2006, 20h08
  4. Réponses: 1
    Dernier message: 26/05/2006, 11h11
  5. Réponses: 2
    Dernier message: 02/05/2006, 09h32

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