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 :

Récupérer évènement fermeture deuxième fenêtre


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2019
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 62
    Par défaut Récupérer évènement fermeture deuxième fenêtre
    bonjour à tous,
    J'essaye désespérément de fermer une deuxième fenêtre (openWindow_Notes) en utilisant buttonbox mais ma seule réussite est de fermer toutes les fenêtres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.buttonBox.accepted.connect(app.quit)
    je souhaite également en fermant cette deuxième fenêtre actualiser un tableview (fenetre Ui_MainWindow) mais impossible de récupérer l'évènement fermeture (openWindow_Notes).
    j'imagine que mon problème vient de l'import dans ma "class Fenetre" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Fenetre(QtWidgets.QMainWindow):
     
    #import fenetre principale
     self.ui = Ui_MainWindow()
     self.ui.setupUi(self)
     
     
    # ouvre fenetre Notes
        def openWindow_Notes(self):
            self.window_Notes = QtWidgets.QMainWindow()
            self.ui = Ui_Dialog_Notes()
            self.ui.setupUi(self.window_Notes)
            self.window_Notes.show()
    En vous remerciant,

  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,

    Au niveau du principe, si une fenêtre 1 a ouvert une fenêtre 2:

    - pour que la fenêtre 1 ferme la fenêtre 2, il suffit de reprendre la variable de la fenêtre 2 pour appeler sa méthode .close().

    - pour que la fenêtre 1 puisse avoir l'info de la fermeture de la fenêtre 2, on crée un nouveau signal (QtCore.pyqtSignal()) dans la fenêtre 2 que l'on "branche" (.connect()) à son lancement sur une méthode de la fenêtre 1. Dans la fenêtre 2, on utilise sa méthode "closeEvent" pour émettre son signal de fermeture (.emit()) qui sera donc reçu par la fenêtre 1. Si la fenêtre 1 a lancé plusieurs fenêtres, elle peut connaître celle qui a été fermée si le signal de fermeture "porte" un identifiant de cette fenêtre 2. De la même façon, à la fermeture de la fenêtre 1 (arrêt du programme par exemple), cette fenêtre 1 peut connaître les fenêtres 2 qui n'ont pas été fermées (test var!=None) et les fermer (.close()) dans son propre closeEvent: il suffit que les variables de ces fenêtres 2 soient à None quand elles sont fermées (à initialiser dans le __init__ de la fenêtre 1).

  3. #3
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2019
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 62
    Par défaut Récupérer évènement fermeture deuxième fenêtre
    bonjour tyrtamos et encore merci,
    j'ai toujours des erreurs quoi que je fasse ou le résultat n'est pas probant. J'imagine que ça vient de Ui
    dans ma fenêtre principale je fais :

    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
     
     #####test
            self.Deux=None
     
    def openWindow_Deux(self):
     
            if self.Deux==None:
                self.Deux = Ui_Deux()
                self.ui = Ui_Deux()
                self.ui.setupUi(self.Deux)
                self.Deux.fermeturefen2.connect(self.fen2close)
                self.Deux.show()
     
    #========================================================================
       def fen2close(self):
            """méthode appelée par la fermeture de la fenêtre 2
            """
            print('def fen2close')
            self.Deux = None
     
        #========================================================================
        def closeEvent(self, event):
            """méthode appelée lors de la fermeture de la fenêtre 1
            """
            if self.Deux != None:
                print('Deux ok')
                # la fenêtre 2 est encore ouverte: on la ferme!
                self.Deux.close()
                self.Deux = None
                print("Fenêtre 2 fermée")
            print("Fenêtre 1 fermée")
            event.accept()
    Merci

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10
    Par défaut Mon pense bête
    Voila ce que j'utilise comme technique pour renvoyer un message à la fenêtre appelante

    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
     
        #########################################
        # Dans la sous-fenêtre
        #########################################
        # Communication inter thread ou inter fenêtre
        # Dans le thread/fenêtre en tête de class pour être global de la deuxième fenêtre
        MonSignalARenvoyer_signal = pyqtSignal(type de donnée) #*int, str, rien si déclencheur, plusieurs genre (str, int)
        # Exemple : resultat_signal = pyqtSignal(str)
     
        # Dans une sous routine de la class quand on désire envoyer le message
        self.MonSignalARenvoyer_signal.emit(Donnée) #*Celle précisée lors de la création du signa l ou rien si déclencheur
        # Exemple : self.resultat_signal.emit('OK')
     
        #########################################
        # Dans la fenêtre principale
        #########################################
     
        # Dans la routine appelante entre la création de la fenêtre et son lancement
        maFen = maFenetre()
     
        self.La sous fenêtre.MonSignalARenvoyer_signal.connect(self.ProcédureALancer)
        # Exemple : maFen.resultat_signal.connect(self.gestionResultat)
     
        # Affichage de la sous-fenêtre
        maFen.exec_()
     
        # Et gestion resultat un truc du genre
        def gestionResultat(self, retourFen):
              self.retourFen = retourFen
              # ou tout autre traitement de la variable retourFen qui contient 'OK'
    J'espère que je suis dans les clous et que j'ai été assez clair.

  5. #5
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2019
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 62
    Par défaut signal entre fenêtre
    bonsoir lukky et merci
    comme dans la proposition de tyrtamos,
    le signal fonctionne dans ma sous fenêtre
    mais je n'arrive pas à le récupérer dans ma fenêtre principale.
    impossible de lancer self.gestionResultat ou de récupérer un str

    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
        class Fenetre1(QtWidgets.QMainWindow):
     
     
        def __init__(self, parent=None):
        super().__init__(parent)    
     
     
     
       def openWindow_Deux(self):
     
            #if self.Deux==None:
            self.Deux = QtWidgets.QMainWindow()
            self.Deux = Ui_Deux()
            self.ui = Ui_Deux()
            self.ui.setupUi(self.Deux)
            self.Deux.MonSignalARenvoyer_signal.connect(self.gestionResultat)
            self.Deux.show()
    Merci

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

    Voilà un exemple complet de ce que je fais sur le sujet:

    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import QtCore, QtWidgets
     
    #############################################################################
    class Fenetre2(QtWidgets.QWidget):
     
        # crée un nouveau signal de fermeture qui portera l'indice de la fenêtre
        # ainsi que n'importe quelle autre donnée (ici: une chaîne de caractères) 
        fermeturefen2 = QtCore.pyqtSignal(int, str)
     
        #========================================================================
        def __init__(self, ind, parent=None):
            super().__init__(parent)
     
            self.ind = ind # indice de la fenêtre
            self.setWindowTitle("Fenetre2 d'indice {}".format(self.ind))
            self.resize(400, 300)
     
            # crée la ligne de saisie
            self.edit = QtWidgets.QLineEdit() 
     
            # positionne le QLineEdit dans la fenêtre
            layout = QtWidgets.QGridLayout()
            layout.addWidget(self.edit, 0, 0)
            self.setLayout(layout)
     
        #========================================================================
        def closeEvent(self, event):
            """à la fermeture de cette fenêtre 2, celle-ci envoie un signal à la 
               fenêtre 1 appelante avec son indice, ainsi que le contenu de sa 
               ligne de saisie
            """
            self.fermeturefen2.emit(self.ind, self.edit.text()) 
            event.accept() # accepte la fermeture
     
    #############################################################################
    class Fenetre1(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.setWindowTitle("Fenetre 1")
            self.resize(300, 200)
     
            # crée un bouton
            self.boutonfen2 = QtWidgets.QPushButton("Lancer une 2ème fenêtre!", self)
            self.boutonfen2.clicked.connect(self.lancefen2)
     
            # positionne le bouton dans la fenêtre
            layout = QtWidgets.QGridLayout()
            layout.addWidget(self.boutonfen2, 0, 0)
            self.setLayout(layout)
     
            # initialise le liste des variables d'instance des fenetres 2
            self.fenetre2 = []
     
        #========================================================================
        def lancefen2(self):
            """méthode appelée par le bouton, Lance une deuxième fenêtre
            """
            # cherche un indice non utilisé dans la liste self.fenetre2
            ind = -1
            for i in range(0, len(self.fenetre2)):
                if self.fenetre2[i] is None:
                    ind = i
                    break
            if ind==-1:
                # aucune place inutilisée, on ajoute un nouvel indice
                self.fenetre2.append(None)
                ind = len(self.fenetre2)-1 
     
            # crée une nouvelle fenêtre 2 d'indice ind et lui transmet l'indice
            self.fenetre2[ind] = Fenetre2(ind)
            # prépare la future fermeture de la fenêtre 2 d'indice ind 
            self.fenetre2[ind].fermeturefen2.connect(self.fen2close)
            # affiche cette 2ème fenêtre
            self.fenetre2[ind].show()
     
        #========================================================================
        def fen2close(self, ind, texte):
            """méthode appelée par la fermeture de la fenêtre 2 d'indice ind
               dont la ligne de saisie contenait texte
            """
            print("Fenetre 2 d'indice {} fermée avec le texte: {}".format(ind, texte))
            # signale que la fenetre 2 d'indice ind est désormais fermée
            self.fenetre2[ind] = None 
     
        #========================================================================
        def closeEvent(self, event):
            """méthode appelée lors de la fermeture de la fenêtre 1
               ===> ferme toutes les fenêtres2 encore ouvertes
            """
            for i in range(0, len(self.fenetre2)):
                if self.fenetre2[i]!=None:
                    # la fenêtre 2 d'indice i est encore ouverte: on la ferme!
                    self.fenetre2[i].close()
                    self.fenetre2[i] = None
            event.accept()    
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
     
        fenetre1 = Fenetre1()
        fenetre1.show()
     
        sys.exit(app.exec_())
    Lorsque la fenêtre 1 est affichée, on crée et affiche toutes les fenêtres 2 qu'on veut en cliquant autant de fois sur son bouton. Chaque fenêtre 2 est affichée avec son indice en titre.

    En fermant une fenêtre d'indice ind, celle-ci renvoie (.emit) à la fenêtre 1 son indice ainsi que le contenu de sa ligne de saisie.

    En demandant la fermeture de la fenêtre 1, toutes les fenêtres 2 encore ouvertes sont fermées avant la fermeture de la fenêtre 1 elle-même.

    Code à lancer en console ou en ide pour l'affichage des print(...).

Discussions similaires

  1. Récupérer l'événement d'une fenêtre fille
    Par Wilco dans le forum Langage
    Réponses: 7
    Dernier message: 21/01/2008, 12h18
  2. [Fermeture de fenêtre]Quel évènement choisir?
    Par 1tox dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 22/05/2007, 09h22
  3. Détection de l'évènement fermeture d'une fenêtre
    Par noa dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/05/2006, 13h57
  4. récupérer l'événement "fermeture par la croix" de
    Par hamurielle dans le forum Windows Forms
    Réponses: 4
    Dernier message: 08/04/2005, 10h35
  5. opération sur fermeture de fenêtre
    Par java_math dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 20/06/2004, 22h52

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