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

GUI Python Discussion :

PyQT: Quelle méthode à utiliser hide or close pour fermer une fenêtre ?


Sujet :

GUI Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 61
    Par défaut PyQT: Quelle méthode à utiliser hide or close pour fermer une fenêtre ?
    Bonjour,

    J'ai une fenêtre qui en cliquant sur un bouton ouvre une nouvelle fenêtre. Pour fermer la première fenêtre, j'ai utilisé la méthode hide ou close qui marchent pour moi mais je ne sais pas la différence entre ces 2 méthodes ni la meilleure pour mon code. Voici un extrait de mon code :
    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
     
    class TRANUSInterfaceVariationDialog(QtGui.QDialog, FORM_CLASS):
        def __init__(self,project,parent=None):
            """Constructor."""
     
            super(TRANUSInterfaceVariationDialog, self).__init__(parent)
            self.setupUi(self)
            self.launch_btn.clicked.connect(self.launch_TRANUS_variation)
     
        def launch_TRANUS_variation(self):
     
            dialog = launch_variation_dialog.LaunchVariationDialog(self.folder,self.base_scenario.code,self.tranus_binaries,parent=self)
            #self.close()
            self.hide()
            dialog.show()
            result = dialog.exec_()
    Merci pour votre aide.

  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,

    Les 2 méthodes sont très différentes:

    - "hide" permet de ne pas afficher la fenêtre, mais elle existe toujours et peut être ré-affichée avec "show".

    - "close" permet de fermer la fenêtre qui n'existe plus. On peut d'ailleurs aller plus loin:
    => en surchargeant la méthode "closeEvent" pour tester si le contexte ou l'utilisateur permette effectivement la fermeture
    => en demandant au moment du lancement de la fenêtre que les ressources allouées à la fenêtre soient détruites à la fermeture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.fenetre.setAttribute(QtCore.Qt.WA_DeleteOnClose)

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Il se posent tout de même quelques questions avec ton montage.

    J'ai l'impression que la première fenêtre est déjà elle-même un QDialog, dans ce cas une fermeture avec QDialog.accept() serait plus judicieux.

    Mais surtout, tu donnes à la nouvelle fenêtre la première comme parent, je ne détruirais donc pas celle-ci avant que soit fermée la dernière fenêtre.

    plutôt quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            dialog = launch_variation_dialog.LaunchVariationDialog(self.folder,self.base_scenario.code,self.tranus_binaries,parent=self)
            dialog.show()
            result = dialog.exec_()
            self.accept()
    Éventuellement, tu peux la cacher pendant l'exécution de la dernière fenêtre, mais, si celle-ci est modale, elle restera toujours au dessus de l'autre.

  4. #4
    Membre confirmé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 61
    Par défaut Merci pour votre réponse
    J'ai testé avec self.accept() et ça marche pour moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dialog = launch_variation_dialog.LaunchVariationDialog(self.folder,self.base_scenario.code,self.tranus_binaries,parent=self)
            #self.close()
            #self.hide()
            self.accept()
            dialog.show()
            result = dialog.exec_()
    Mon interface est intégrée sous forme de plugin dans QGIS. Quand je la relance j'obtiens la première interface avec les mêmes valeurs d'avant, du coup je réfléchis si j'initialise les valeurs et dans ce cas je suis obligée de passer par la méthode close si je comprends bien.
    Citation Envoyé par VinsS Voir le message
    Salut,

    Il se posent tout de même quelques questions avec ton montage.

    J'ai l'impression que la première fenêtre est déjà elle-même un QDialog, dans ce cas une fermeture avec QDialog.accept() serait plus judicieux.

    Mais surtout, tu donnes à la nouvelle fenêtre la première comme parent, je ne détruirais donc pas celle-ci avant que soit fermée la dernière fenêtre.

    plutôt quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            dialog = launch_variation_dialog.LaunchVariationDialog(self.folder,self.base_scenario.code,self.tranus_binaries,parent=self)
            dialog.show()
            result = dialog.exec_()
            self.accept()
    Éventuellement, tu peux la cacher pendant l'exécution de la dernière fenêtre, mais, si celle-ci est modale, elle restera toujours au dessus de l'autre.

  5. #5
    Membre confirmé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 61
    Par défaut Merci pour votre réponse
    J'ai utilisé la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.fenetre.setAttribute(QtCore.Qt.WA_DeleteOnClose)
    pour détruire les ressources allouées et j'ai eu cette erreur :
    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
    An error has occurred while executing Python code: 
     
    RuntimeError: wrapped C/C++ object of type QLineEdit has been deleted 
    Traceback (most recent call last):
      File "C:/Users/emna/.qgis2/python/plugins\TRANUSInterfaceVariation\TRANUS_Interface_Variation.py", line 192, in run
        self.dlg.show()
      File "C:/Users/emna/.qgis2/python/plugins\TRANUSInterfaceVariation\TRANUS_Interface_Variation_dialog.py", line 159, in show
        self.layers_group_name.setText('Tranus Variation')
    RuntimeError: wrapped C/C++ object of type QLineEdit has been deleted
     
     
    Python version: 2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)] 
    QGIS version: 2.18.3 Las Palmas, 77b8c3d 
     
    Python Path:
    C:/OSGEO4~1/apps/qgis/./python/plugins\processing
    C:/OSGEO4~1/apps/qgis/./python
    C:/Users/emna/.qgis2/python
    C:/Users/emna/.qgis2/python/plugins
    C:/OSGEO4~1/apps/qgis/./python/plugins
    C:\OSGEO4~1\apps\Python27\lib\site-packages\pip-9.0.1-py2.7.egg
    C:\OSGEO4~1\bin\python27.zip
    C:\OSGEO4~1\apps\Python27\DLLs
    C:\OSGEO4~1\apps\Python27\lib
    C:\OSGEO4~1\apps\Python27\lib\plat-win
    C:\OSGEO4~1\apps\Python27\lib\lib-tk
    C:\OSGEO4~1\bin
    C:\OSGEO4~1\apps\Python27
    C:\OSGEO4~1\apps\Python27\lib\site-packages
    C:\OSGEO4~1\apps\Python27\lib\site-packages\jinja2-2.7.2-py2.7.egg
    C:\OSGEO4~1\apps\Python27\lib\site-packages\markupsafe-0.23-py2.7-win-amd64.egg
    C:\OSGEO4~1\apps\Python27\lib\site-packages\pytz-2012j-py2.7.egg
    C:/Users/emna/.qgis2//python
    C:\Users\emna\.qgis2\python\plugins\tranus_qgis_plugin
    Pour info, j'intègre mon interface sous forme de plugin dans QGIS, du coup j'aimerais bien initialiser les valeurs de la première fenêtre
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Les 2 méthodes sont très différentes:

    - "hide" permet de ne pas afficher la fenêtre, mais elle existe toujours et peut être ré-affichée avec "show".

    - "close" permet de fermer la fenêtre qui n'existe plus. On peut d'ailleurs aller plus loin:
    => en surchargeant la méthode "closeEvent" pour tester si le contexte ou l'utilisateur permette effectivement la fermeture
    => en demandant au moment du lancement de la fenêtre que les ressources allouées à la fenêtre soient détruites à la fermeture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.fenetre.setAttribute(QtCore.Qt.WA_DeleteOnClose)

  6. #6
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    C'est probablement parce que tu fermes la fenêtre avant le nouveau dialogue, dans mon code je le fais après.

    Et tu ne gardes pas de référence de dialog, ça peut jouer des tours aussi.

  7. #7
    Membre confirmé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 61
    Par défaut Autre question pour autre interface
    Bonjour,

    J'ai une autre interface et j'ai utilisé self.accept() mais ça n'a pas marché. Voilà un extrait de mon code :

    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
     
     
    class OptionsTRANUSDialog(QtGui.QDialog, FORM_CLASS):
     
        def __init__(self,project,parent=None):
            """Constructor."""
            super(OptionsTRANUSDialog, self).__init__(parent)
     
            self.setupUi(self)
            self.launch_btn.clicked.connect(self.launch_options_TRANUS)
     
     
      def launch_options_TRANUS(self):
     
            self.get_checked_list()
     
            if self.checked_list != [] :
     
                dialog = launch_tranus_dialog.LaunchTRANUSDialog(self.checked_list,self.folder,self.tranus_binaries,parent=self) 
                self.accept()
                dialog.show()
                result = dialog.exec_()
            self.reinitialise_checked_list()

  8. #8
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Tu refais la même erreur, tu fermes le dialogue avec self.accept() avant d'exécuter le dialogue suivant.

    Est-ce que la première fenêtre de dialogue est vraiment gênante pour la deuxième que tu t'empresses de la fermer ?

    Cela dit, empiler les boîtes de dialogue n'est pas toujours agréable pour l'utilisateur, tu ne peux pas simplifier ton application ? Juste un avis, hein.

Discussions similaires

  1. Réponses: 11
    Dernier message: 01/07/2012, 15h12
  2. script pour fermer une fenètre
    Par nono2009 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 06/06/2009, 14h11
  3. Quelle méthode utiliser pour traiter les images
    Par babozfr dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 02/03/2007, 15h40
  4. Quelle méthode utiliser pour un formulaire
    Par sam01 dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2006, 16h42
  5. Réponses: 4
    Dernier message: 02/05/2006, 12h08

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