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
   | #!/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 
    fermeturefen2 = QtCore.pyqtSignal(int)
 
    #========================================================================
    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)
 
    #========================================================================
    def closeEvent(self, event):
        """à la fermeture de cette fenêtre 2, celle-ci envoie un signal à la 
           fenêtre 1 appelante avec l'indice de la fenêtre
        """
        self.fermeturefen2.emit(self.ind) 
        event.accept()
 
#############################################################################
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.bouton = QtWidgets.QPushButton("Lancer une 2ème fenêtre!", self)
        self.bouton.clicked.connect(self.appelfen2)
 
        # positionne le bouton dans la fenêtre
        posit = QtWidgets.QGridLayout()
        posit.addWidget(self.bouton, 0, 0)
        self.setLayout(posit)
 
        # initialise le liste des variables des fenetres 2
        self.fenetre2 = []
 
    #========================================================================
    def appelfen2(self):
        """méthode appelée par le bouton, Lance la 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]==None:
                ind = i
                break
        if ind==-1:
            # aucune place vide, on crée un nouvel indice
            self.fenetre2.append(None)
            ind = len(self.fenetre2)-1 
 
        # crée une nouvelle fenêtre 2 d'indice ind
        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):
        """méthode appelée par la fermeture de la fenêtre 2 d'indice ind
        """
        self.fenetre2[ind] = None
 
    #========================================================================
    def closeEvent(self, event):
        """méthode appelée lors de la fermeture de la fenêtre 1
        """
        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
                print("Fenêtre 2 indice {} fermée".format(i))
        print("Fenêtre 1 fermée")
        event.accept()    
 
#############################################################################
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    fenetre1 = Fenetre1()
    fenetre1.show()
    sys.exit(app.exec_()) | 
Partager