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 :

Problème à la fermeture de l'application


Sujet :

PyQt Python

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut Problème à la fermeture de l'application
    bonjour,
    lorsque je ferme mon application en cliquant sur le bouton croix de la fenêtre , je voudrais réaliser quelques commandes avant cette fermeture
    j'ai trouvé ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    app.connect(app,SIGNAL("lastWindowClosed()"),app,SLOT("quit()"))
    j'ai mis mes instructions dans la fonction quit(), mais visiblement j'ai tout faux

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Il faut surcharger la méthode closeEvent de QMainWindow

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        def closeEvent(self, event):
            #..  fait ce qu'il faut
     
            # On termine avec ceci pour éviter une erreur de segmentation
            QtCore.QCoreApplication.processEvents()
            sys.exit()
    Ici self est l'instance de QMainWindow

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    merci pour la réponse,
    mais je n'y arrive pas; j'ai rajouté la fonction dans ma classe en rajoutant les instructions à faire
    mais rien ne se passe
    pour info j'ai utilisé qt designer pour réaliser ma fenêtre j'ai crée un fichier du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from ESSAI02M import * #le fichier py généré par pyiuc4
    class myApp(QMainWindow, Ui_MainWindow): 
            # Note : ici self représente la classe
            def __init__(self, parent=None):
                    QMainWindow.__init__(self) 
                    self.setupUi(parent)
    #....
            def closeEvent(self, event):
     
                    print "au revoir"
     
                    # On termine avec ceci pour éviter une erreur de segmentation
                    QtCore.QCoreApplication.processEvents()
                    sys.exit()

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Corrections suggérées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            def __init__(self, parent=None):
                    super(myApp, self).__init__(parent)
                    self.setupUi(self)
    et:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def closeEvent(self, event):
            ...
            ...
            # acceptation de la fermeture
            event.accept()
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour tyrtamos,

    j'ai toujours le même problème l'instruction print ne s'effectue pas à la fermeture

  6. #6
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Parce que closeEvent n'est pas méthode de ta QMainWindow.

    Ceci est dut à la manière dont tu crées ta fenêtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class myApp(QMainWindow, Ui_MainWindow)
    Qu'est-ce-que ce Ui_MainWindow ? Le problème est là à coup sur.

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    j'ai utilisé qt designer pour réaliser mon interface graphique qt designer génère un fichier xml qui peut être traduit en un fichier python
    dont voici le début
    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
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'ESSAI02M.ui'
    #
    # Created: Thu Nov 27 12:12:35 2014
    #      by: PyQt4 UI code generator 4.10.3
    #
    # WARNING! All changes made in this file will be lost!
     
    from PyQt4 import QtCore, QtGui
     
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
     
    try:
        _encoding = QtGui.QApplication.UnicodeUTF8
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig, _encoding)
    except AttributeError:
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig)
     
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName(_fromUtf8("MainWindow"))
            MainWindow.resize(640, 480)
            self.centralwidget = QtGui.QWidget(MainWindow)
            self.centralwidget.setObjectName(_fromUtf8("centralwidget"))

  8. #8
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Je m'en doutais un peu. (eric IDLE procède comme ça aussi)

    Change ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    from ESSAI02M import Ui_MainWindow
     
    class myApp(object): 
        def __init__(self, parent=None):
            main = QMainWindow()
            self.ui =  Ui_MainWindow()
            self.ui.setupUi(main)
            self.ui.closeEvent = self.closeEvent
            self.ui.show()
     
        def closeEvent(self, event):
            ...

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par VinsS Voir le message
    Qu'est-ce-que ce Ui_MainWindow ? Le problème est là à coup sur.
    J'utilise cette technique de temps en temps et elle fonctionne bien. C'est de l'héritage multiple, et elle est permise ici parce que Ui_MainWindow est une classe qui hérite de object (de Python) et non de QObject (de PyQt4).

    Voilà un petit code en Python 2 qui fonctionne, y compris avec le print du closeEvent:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python 2.7
     
    import sys
     
    from PyQt4 import QtCore, QtGui
    from module_issu_de_pyuic4 import Ui_MainWindow
     
    #############################################################################
    class Fenetre(QtGui.QMainWindow, Ui_MainWindow):
     
        def __init__(self, parent=None):
            super(Fenetre, self).__init__(parent)
            self.setupUi(self)
     
        def closeEvent(self, event):
            print "fin!"
            event.accept()
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  10. #10
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    ok ça marche
    merci à vous deux et en particulier à tyrtamos
    la différence était subtile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class myApp(QMainWindow, Ui_MainWindow): 
            # Note : ici self représente la classe
            def __init__(self, parent=None):
     
                    super(myApp, self).__init__(parent)
                     self.setupUi(self)      #      mon code ==>self.setupUi(parent)
    je vous souhaite une bonne journée

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

Discussions similaires

  1. problème de fermeture de l'application
    Par allanibu dans le forum Langage
    Réponses: 5
    Dernier message: 15/09/2008, 12h03
  2. Problème de fermeture de l'application
    Par devat27 dans le forum Langage
    Réponses: 9
    Dernier message: 20/03/2008, 12h05
  3. [VB2005] Problème de fermeture de l'application
    Par exclusif dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/08/2006, 15h32
  4. [C#] problème de fermeture d'une application
    Par padodanle51 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 30/05/2006, 14h07
  5. Problème de fermeture de l'application
    Par SkyDev dans le forum Langage
    Réponses: 2
    Dernier message: 16/06/2004, 02h06

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