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 :

Envoyer un signal de fermeture d'une fenêtre à une autre


Sujet :

PyQt Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    ingé
    Inscrit en
    Juillet 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ingé
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2023
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Envoyer un signal de fermeture d'une fenêtre à une autre
    Bonjour
    Merci d'avance pour vos réponses.
    La situation est la suivante:
    - j'utilise PySide2
    - j'ai une classe Ui_fenêtreprincipale (dans un fichier fenêtrepricipale.py) avec la méthode SetupUi() qui définie les élément de la fenêtre.
    - J'ai une classe Ui_fenêtresecondaire (dans un fichier fenêtresecondaire.py) avec la méthode SetupUi() qui définie les élément de la fenêtre.
    - à partir d'un program main:
    - Je crée une fenêtreprincipale comme suit:
    fenêtreprincipale=QtWidgets.QMainWindow()
    uifenêtrepricipale=Ui_fenêtrepricipale()
    uifenêtrepricipale.SetUpui(fenêtrepricipale)

    - Je crée une fenêtresecondaire comme suit:
    fenêtreseconaire=QtWidgets.QWidget()
    uifenêtresecondaire=Ui_fenêtresecondaire()
    uifenêtrsecondaire.SetUpui(fenêtresecondaire)

    sur la fenêtre principale il y a le boutton "LancerFenêtreSecondaire", lorsqu'il est cliqué une fonction est exécutée.
    Cette fonction désactive le boutton "LancerFenêtreSecondaire" (uifenetrepricipale.LancerFenêtreSecondaire.setEnabled(False)) et affiche "fenêtresecondaire" (fenêtreseconaire.show()).
    Mon but est de garder désactivé le boutton "LancerFenêtreSecondaire" sur "fenêtrepricipale" jusqu'à ce que la "fenêtresecondaire" soit fermée.
    Comment faire pour gérer ceci? est ce que je doit utiliser le signal close()? comment l'utiliser? et qu'est ce que je dois mettre dans chaque classe pour que ça marche.
    Merci encore une fois pour vos réponses.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par MarTux Voir le message
    Mon but est de garder désactivé le boutton "LancerFenêtreSecondaire" sur "fenêtrepricipale" jusqu'à ce que la "fenêtresecondaire" soit fermée.
    Comment faire pour gérer ceci?
    Déjà si ta fenêtre secondaire est modale, alors l'utilisateur n'a pas accès à la première fenêtre et à son bouton, ce qui rend la désactivation inutile.

    Sinon tu peux surcharger le closeEvent() de la fenêtre secondaire automatiquement appelé quand elle est fermée. Et lui faire envoyer un signal que tu récupères dans la fenêtre principale.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    ingé
    Inscrit en
    Juillet 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ingé
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2023
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre retour.
    Ce n’est pas utile dans mon cas de mettre modale la fenêtre secondaire parce qu’il y a d’autres boutons dessus que je pourrais vouloir utiliser (d’autres workflows à lancer), je veux seulement que le bouton qui a lancé la fenêtresecondaire soit désactivé pour ne pas lancer le même workflow tant que celui déjà commencé n’est pas terminé.
    Donc la meilleure chose à faire c’est le closeEvent, j’ai essayé de le faire mais ça n’a pas marché, je sais pas qu’est ce que j’ai loupé, c’est pour cela que j’ai lancé cette discussion.
    😊

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MarTux Voir le message
    j’ai essayé de le faire mais ça n’a pas marché, je sais pas qu’est ce que j’ai loupé
    Ptet t'as oublié d'envoyer un signal...

    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    import sys
     
    class myWidget(QWidget):
    	def __init__(self, *args, **kwargs):
    		super().__init__(*args, **kwargs)
     
    		self.__btn=QPushButton("Autre fenêtre", parent=self, clicked=self.__slotSubWinOn)
     
    		mainLayout=QVBoxLayout(self)
    		mainLayout.addWidget(self.__btn, stretch=0)
    		self.resize(300, 200)
    	# __init()
     
    	def __slotSubWinOn(self):
    		self.__btn.setDisabled(True)
    		self.__win=mySubWin()
    		self.__win.sigClose.connect(self.__slotSubWinOff)
    		self.__win.show()
    	# __slotSubWinOn()
     
    	def __slotSubWinOff(self):
    		self.__btn.setEnabled(True)
    	# __slotSubWinOff()
    # class myWidget
     
    class mySubWin(QWidget):
    	sigClose=pyqtSignal()
     
    	def __init__(self, *args, **kwargs):
    		super().__init__(*args, **kwargs)
     
    		self.__btn=QPushButton("Fermer", parent=self, clicked=self.close)
    		mainLayout=QVBoxLayout(self)
    		mainLayout.addWidget(self.__btn, stretch=0)
    		self.resize(180, 150)
    	# __init__()
     
    	def closeEvent(self, event):
    		self.sigClose.emit()
    		super().closeEvent(event)
    	# closeEvent()
    # mySubWin()
     
    if __name__ == "__main__":
    	appli=QApplication(sys.argv)
    	widget=myWidget()
    	widget.show()
    	sys.exit(appli.exec_())
    # if
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    ingé
    Inscrit en
    Juillet 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ingé
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2023
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai essayé de faire des choses comme ceci mais ça n'a pas marché.
    Est ce que le fait que je ne crée pas mes fenêtrse de la même manière que ce que vous avez fait est la raison pour laquelle ça ne marche pas?
    Pour rappel, je crée mes fenêtre de cette manière:
    Exemple:
    fenêtresecodaire = Qwidgets.Qwidgets()
    uifenêtrescodaire = Ui_fenêtresocodaire()
    uifenêtresecodaire.setupUI(fenetrescondaire)

    je sais pas

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MarTux Voir le message
    Pour rappel, je crée mes fenêtre de cette manière:
    Exemple:
    fenêtresecodaire = Qwidgets.Qwidgets()
    uifenêtrescodaire = Ui_fenêtresocodaire()
    uifenêtresecodaire.setupUI(fenetrescondaire)
    Et ça tu le fais à quel moment? Dans le slot du bouton comme moi ou ailleurs?
    Si c'est dans le slot alors il faut définir la fenêtre secondaire comme attribut de la fenêtre principale (en l'associant à self) pour pas qu'elle disparaisse quand le slot se termine...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    ingé
    Inscrit en
    Juillet 2023
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : ingé
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2023
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je fais ça à l'ouverture de ma fenêtre principale.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par MarTux Voir le message
    Est ce que le fait que je ne crée pas mes fenêtrse de la même manière que ce que vous avez fait est la raison pour laquelle ça ne marche pas?
    C'est un peu plus compliqué que çà.
    Vous avez à explorer/chercher des articles qui traitent ce sujet comme celui-ci

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par MarTux Voir le message
    Je fais ça à l'ouverture de ma fenêtre principale.
    Ca change pas grand chose mais faut surtout pas que l'autre fenêtre soit détruite à la fermeture (donc éviter le setAttribute(Qt.WA_DeleteOnClose) dans la sous-fenêtre ou alors ne pas appeler "close" sur le bouton)...

    Citation Envoyé par MarTux Voir le message
    le closeEvent, j’ai essayé de le faire mais ça n’a pas marché, je sais pas qu’est ce que j’ai loupé
    T'as mis du print() dans le closeEvent voir s'il était appelé?

    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    import sys
     
    class myWidget(QWidget):
    	def __init__(self, *args, **kwargs):
    		super().__init__(*args, **kwargs)
     
    		self.__btn=QPushButton("Autre fenêtre", parent=self, clicked=self.__slotSubWinOn)
     
    		mainLayout=QVBoxLayout(self)
    		mainLayout.addWidget(self.__btn, stretch=0)
    		self.resize(300, 200)
     
    		self.__other=mySubWin()
    		self.__other.setVisible(False)
    		self.__other.sigClose.connect(self.__slotSubWinOff)
    	# __init()
     
    	def __slotSubWinOn(self):
    		self.__btn.setDisabled(True)
    		self.__other.show()
    	# __slotSubWinOn()
     
    	def __slotSubWinOff(self):
    		self.__btn.setEnabled(True)
    	# __slotSubWinOff()
    # class myWidget
     
    class mySubWin(QWidget):
    	sigClose=pyqtSignal()
     
    	def __init__(self, *args, **kwargs):
    		super().__init__(*args, **kwargs)
     
    		self.__btn=QPushButton("Fermer", parent=self, clicked=self.close)
    		mainLayout=QVBoxLayout(self)
    		mainLayout.addWidget(self.__btn, stretch=0)
    		self.resize(180, 150)
    	# __init__()
     
    	def closeEvent(self, event):
    		print(
    			"%s => %s.closeEvent(%s)" % (
    				self.sender().__class__.__name__,
    				self.__class__.__name__,
    				"%s (%s)" % (event.__class__.__name__, type(event)),
    			)
    		)
     
    		self.sigClose.emit()
    		super().closeEvent(event)
    	# closeEvent()
    # mySubWin()
     
    if __name__ == "__main__":
    	appli=QApplication(sys.argv)
    	widget=myWidget()
    	widget.show()
    	sys.exit(appli.exec_())
    # if
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Signal de fermeture d'une boite de dialogue
    Par black is beautiful dans le forum Débuter
    Réponses: 14
    Dernier message: 24/02/2009, 22h39
  2. Réponses: 4
    Dernier message: 19/06/2008, 10h20
  3. Réponses: 3
    Dernier message: 24/01/2008, 17h02
  4. rafraichir une page a la fermeture d une autre
    Par mereyj dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 27/03/2006, 17h21
  5. [VB6] [MDI] Signaler la fermeture d'une fille à la mère
    Par cpri1shoot dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/04/2004, 08h57

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