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 :

Gestion plusieurs fenêtres


Sujet :

PyQt Python

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Points : 213
    Points
    213
    Par défaut Gestion plusieurs fenêtres
    Bonjour tout le monde !

    Je reviens avec ma gestion de plusieurs fenêtres (suite de cette discussion https://www.developpez.net/forums/d1...eurs-fenetres/)

    La solution trouvée me convient bien mais je voulais "optimiser" un peu tout ça.

    J'ai plusieurs sous fenêtres à ouvrir à partir d'une page d'accueil.
    Pour le moment j'utilise ce fonctionnement :
    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
    #actions liées aux boutons - declenche ouverture des fenetres
            self.button_conv_visco.clicked.connect(self.visco)
     
    def visco(self):
            """lance la fenetre associee a la conversion de viscosite"""
            ind=self.quellefenetre(self.viscowindow)
     
            self.viscowindow[ind] = FenetreConversionVisco(ind)
            # prépare la future fermeture de la fenêtre conversion viscosite 
            self.viscowindow[ind].fermetureconvvisco.connect(self.viscoclose)
            # affiche la fenêtre conversion viscosite
            self.viscowindow[ind].show()
     
    #======================================================================== 
    def viscoclose(self,ind):
            """méthode apppelée par la fermeture d'une fenetre conversion viscosite"""
     
            self.viscowindow[ind]=None
    Ensuite pour chaque fenêtre j'ai une classe associée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class FenetreConversionVisco(QWidget,Ui_conv_visco):
        """fenetre permettant la conversion entre visco dyn et cinématique"""
    #definition du signal
        fermetureconvvisco=pyqtSignal(int)
    ...

    Sauf que pour chaque nouvelle fenêtre je crée ces deux méthodes... pas top top au final.
    Je voulais donc essayer de passer à une version plus générale du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def ouverture_fenetre_secondaire(self,nom_fenetre,nom_classe,nom_signal)
    ....(reprise du code précédent)
    Première question : est-il possible de passer en argument d'une méthode le nom d'une autre classe ?
    Deuxième question : est-ce que je peux me servir du signal crée dans la classe FenetreconversionVisco comme argument également ?

    Merci d'avance pour votre aide
    Bonne fin de journée

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Points : 213
    Points
    213
    Par défaut
    Bonjour !

    J'ai avancé dans mon programme.
    Mon premier problème venait du fait que je tentais de passer une fonction avec argument dans clicked.connect ... (il me semblait bien que ce n'était pas la bonne méthode)

    Donc première correction :
    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
    class FenetreAccueil(QWidget,accueil.Ui_Aide_aux_calculs_et_conversions):
        """fenetre d'accueil permettant l'acces aux differents utilitaires de calcul"""
     
        def __init__(self,parent=None):
            """constructeur de la fenetre accueil"""
            super(FenetreAccueil,self).__init__(parent)
            self.setupUi(self)
     
            # initialisation des variables des fenetres - permet de tracer le nb de fentres ouvertes
            self.viscowindow = []
    #actions liées aux boutons - declenche ouverture des fenetres
            visco_func=partial(self.ouverture_fenetre_secondaire,self.viscowindow,FenetreConversionVisco)
            self.button_conv_visco.clicked.connect(visco_func)
     
    #========================================================================
        def ouverture_fenetre_secondaire(self,nom_fenetre,nom_classe):
     
            ind=-1
            for i in range (0,len(nom_fenetre)):
                if nom_fenetre[i]==None:
                    ind=i
                    break
            if ind==-1:
                nom_fenetre.append(None)
                ind=len(nom_fenetre)-1
     
            nom_fenetre[ind] = nom_classe(ind,nom_fenetre)        
            nom_fenetre[ind].fermetureconvvisco.connect(self.fenclose)
            nom_fenetre[ind].show()
        #========================================================================    
        def fenclose(self,ind,nom_fenetre):
            nom_fenetre[ind]=None
     
    #############################################################################        
    #############################################################################         
    class FenetreConversionVisco(QWidget,conversion_visco.Ui_conv_visco):
        """fenetre permettant la conversion entre visco dyn et cinématique"""
     
        #definition du signal
        fermetureconvvisco=pyqtSignal(int,list)
     #================== GESTION FENETRE ======================================================
        def __init__(self,ind,nom_fenetre,parent=None):
            super(FenetreConversionVisco,self).__init__(parent)
            self.ind=ind
            self.nom_fenetre=nom_fenetre
            self.setupUi(self)
     
        def closeEvent(self, event):
            """à la fermeture de cette fenêtre celle-ci envoie un signal à la 
               fenêtre accueil
            """
            self.fermetureconvvisco.emit(self.ind,self.nom_fenetre) 
            event.accept()
    Par contre je suis toujours coincée avec l'utilisation du signal comme paramètre de la fonction.
    Pour avoir une version générale du type (pour remplacer la ligne 28 précédente) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nom_fenetre[ind].nom_signal.connect(self.fenclose)
    Si vous avez une idée

    Merci d'avance

    Ps : Si vous voyez une aberration dans mon code (manière de faire ...) n'hésitez pas à me le dire

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Janvier 2020
    Messages
    0
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2020
    Messages : 0
    Points : 213
    Points
    213
    Par défaut
    C'est encore moi.

    J'ai trouvé cette solution :
    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
    class FenetreAccueil(QWidget,accueil.Ui_Aide_aux_calculs_et_conversions):
        """fenetre d'accueil permettant l'acces aux differents utilitaires de calcul"""
     
        def __init__(self,parent=None):
            """constructeur de la fenetre accueil"""
            super(FenetreAccueil,self).__init__(parent)
            self.setupUi(self)
     
            # initialisation des variables des fenetres - permet de tracer le nb de fentres ouvertes
            self.viscowindow = []
     
            #actions liées aux boutons - declenche ouverture des fenetres
            visco_func=partial(self.ouverture_fenetre_secondaire,self.viscowindow,FenetreConversionVisco, FenetreConversionVisco.fermetureconvvisco)
            self.button_conv_visco.clicked.connect(visco_func)    
     
     
     
        #========================================================================
        def ouverture_fenetre_secondaire(self,nom_fenetre,nom_classe,nom_signal):
     
            ind=-1
            for i in range (0,len(nom_fenetre)):
                if nom_fenetre[i]==None:
                    ind=i
                    break
            if ind==-1:
                nom_fenetre.append(None)
                ind=len(nom_fenetre)-1
     
            nom_fenetre[ind] = nom_classe(ind,nom_fenetre)        
            nom_fenetre[ind].nom_signal.connect(self.fenclose)
            nom_fenetre[ind].show()
     
        #========================================================================    
        def fenclose(self,ind,nom_fenetre):
            nom_fenetre[ind]=None
     
    #############################################################################        
    #############################################################################         
    class FenetreConversionVisco(QWidget,conversion_visco.Ui_conv_visco):
        """fenetre permettant la conversion entre visco dyn et cinématique"""
     
        #definition du signal
        fermetureconvvisco=pyqtSignal(int,list)
     
     #================== GESTION FENETRE ======================================================
        def __init__(self,ind,nom_fenetre,parent=None):
            super(FenetreConversionVisco,self).__init__(parent)
            self.ind=ind
            self.nom_fenetre=nom_fenetre
            self.nom_signal=self.fermetureconvvisco
            self.setupUi(self)
     
     
        def closeEvent(self, event):
            """à la fermeture de cette fenêtre celle-ci envoie un signal à la 
               fenêtre accueil
            """
            self.fermetureconvvisco.emit(self.ind,self.nom_fenetre) 
            event.accept()
    Je laisse la discussion ouverte quelques temps si certains ont des commentaires/améliorations à proposer (c'est toujours bon de s'améliorer )

    bonne journée

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/05/2015, 15h54
  2. Gestion de plusieurs fenêtres à l'ouverture
    Par Go'Gaule dans le forum Débuter
    Réponses: 28
    Dernier message: 15/09/2011, 19h03
  3. gestion de plusieurs fenêtres en silverlight
    Par hbib85 dans le forum Silverlight
    Réponses: 3
    Dernier message: 02/03/2009, 09h58
  4. Gestion de plusieurs fenêtres
    Par KiKiTiTi dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 08/08/2008, 16h19
  5. Réponses: 2
    Dernier message: 26/01/2007, 19h54

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