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 :

Une messagebox qui ne fermerait pas la fenêtre principale de l'appli


Sujet :

PyQt Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Septembre 2017
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Une messagebox qui ne fermerait pas la fenêtre principale de l'appli
    Bonjour à toutes et tous,

    Je suis sur une appli dans laquelle j'aimerais mettre en place une boite de dialogue du type "Messagebox".
    Le but étant que l'utilisateur puisse lire l'info du message et qu'en cliquant sur le bouton "ok", cela referme uniquement la boite de dialogue mais pas la fenêtre principale.
    Hors pour l'instant, mon souci est que en cliquant sur le bouton "Ok" de la "Messagebox", cela ferme toute l'appli.

    Mais plutôt qu'un long discours voici les extraits de code que j'ai mis en place pour l'instant:
    Tout d'abord concernant ma fenêtre principale qui démarre avec la méthode "setupUi":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import QMessageBox
     
    class Ui_fn_principale(object):
        def setupUi(self, fn_principale):
            fn_principale.setObjectName("fn_principale")
            fn_principale.resize(620, 194)
            font = QtGui.QFont()
            font.setPointSize(12)
            fn_principale.setFont(font)
            self.centralwidget = QtWidgets.QWidget(fn_principale)
    Puis le signal de ma toolbar qui execute la methode "about" pour ma messagebox:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    self.actionProgramme = QtWidgets.QAction(fn_principale)
            self.actionProgramme.setObjectName("actionProgramme")
     
            #********************************
            # Signal et slots Menu Programme
            #********************************
            self.actionProgramme.triggered.connect(self.about)
    Enfin le "if main" de fin de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        fn_principale = QtWidgets.QMainWindow()
        ui = Ui_fn_principale()
        ui.setupUi(fn_principale)
        fn_principale.show()
        sys.exit(app.exec_())
    Si quelqu'un peut m'expliquer ce qui explique cette fermeture de tout le programme et ce qu'il faut modifier dans le code pour que le clic sur le Ok du messagebox ne ferme que la massagebox et pas toute l'appli.

    Merci d'avance pour l'aide.
    Xavier

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Septembre 2017
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    C'est encore moi...

    J'ai oublié une partie important c'est la définition de ma méthode about:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def about(self):
            message="Message"
            title="Title"
            box = QtWidgets.QMessageBox(None)
            box.setWindowTitle(title)
            box.setText(message)
            box.show()
            box.raise_()
            box.exec_()
    Voilà je pense qu'il y a lessentiel pour comprendre le souci et trouver le problème.
    Merci pour l'aide,
    Xavier

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

    Voilà un petit code simplifié pour test qui montre que la partie "QMessageBox" (reprise en copier-coller) fonctionne. Il faut chercher ailleurs:

    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import (QtWidgets, QtCore)
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.resize(300, 200)
            self.setWindowTitle("Fenêtre de test")
     
            self.bouton = QtWidgets.QPushButton("bouton", self)
            self.bouton.clicked.connect(self.clictest)
     
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.bouton, 0, 0)
            self.setLayout(posit)
     
        #========================================================================
        def clictest(self, checked=None):
            message="Message"
            title="Title"
            box = QtWidgets.QMessageBox(None)
            box.setWindowTitle(title)
            box.setText(message)
            box.show()
            box.raise_()
            box.exec_()        
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        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

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Septembre 2017
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Merci Tyrtamos effectivement ce code fonctionne, cela élimine déjà la partie concernant la methode du Qmessage.
    Je vais continuer à chercher...si quelqu'un à une idée...
    Merci en tout cas pour l'aide
    Xavier

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

    Petit conseil supplémentaire.

    D'après ces 2 lignes, le code semble être celui issu de QtDesigner, modifié après coup:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class Ui_fn_principale(object):
        def setupUi(self, fn_principale):
    Si c'est le cas, c'est une mauvaise idée parce que toute modification ultérieure sous le Designer annulera les ajouts précédents.

    Mais il y a aussi un grand intérêt à ce que les fenêtres soient construites en sous-classant les widgets (QMainWindow, QWidget, QMessageBox, etc...), et en surchargeant ou en complétant leurs méthodes, ceci pour profiter pleinement de la "poo" ("Programmation Orientée Objet"). Voir mon petit code de test.

    Le code issu du designer doit seulement être importé par le programme principal et ne fait que configurer la classe du widget choisi. C'est pour ça qu'il ne contient qu'une classe issue de "object".

    En faisant comme ça, on trouve plus facilement les erreurs de code.
    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

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Septembre 2017
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Oui effectivement Tyrtamos, je prépare en premier lieu toute l'interface graphique de l'appli, bouton, Combobox, Toolbar etc. avec QtDesigner puis j'exporte le .ui en .py et ensuite je configure les signaux et les méthodes de classe (slots) avec Microsoft Studio Code.
    J'aurai aimé tout faire dans le Designer mais je ne comprend pas son mode fonctionnement pour l'édition des signaux. j'ai testé son interface pour l'édition des signaux, mais je n'avance pas.
    Donc je retouche le .py avec Studio Code et je sais que c'est pas top d'intervenir sur le code généré pas le Designer...
    J'ai vu que le Designer ne fait pas de Def __init__ pour la classe principale, il attaque son code par une Def setupUI, une methode qui se lance au démarrage.
    Je dois avouer que je me met depuis peu à PyQt5 et ne saisi pas encore bien (même si je comprend le principe général), les subtilités de classe et autre héritage de classe.

    L'appli que je vous soumet et qui me pose souci pour le messagebox est en fait pour moi une espèce de pense bête où je tente de regrouper sous la forme d'une appli fonctionnelle, les principaux Widgets utilisables dans une appli. Une sorte de bloc-note où je pourrais revenir plus tard reprendre du code au besoin en fonction des Widgets que j'aurais à utiliser dans d'autre appli.

    Merci pour les conseils en tout cas.
    Xavier

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/04/2006, 14h32
  2. lien dessus une images qui n'est pas en background
    Par tiyolx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 04/03/2006, 18h40
  3. Réponses: 8
    Dernier message: 26/01/2006, 14h47
  4. lien pour une table qui ne doit pas etre public
    Par raslain dans le forum Oracle
    Réponses: 1
    Dernier message: 12/12/2005, 13h40
  5. Une requête qui ne reconnait pas is not null
    Par LeBauw dans le forum Access
    Réponses: 2
    Dernier message: 08/09/2005, 12h29

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