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 :

répétition anormale d'action suite à un clic


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    debutant
    Inscrit en
    Mai 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : debutant

    Informations forums :
    Inscription : Mai 2020
    Messages : 13
    Par défaut répétition anormale d'action suite à un clic
    Bonjour à tous
    je vous livre le code suivant qui me pose quelques soucis.
    Je suis en pleine phase d'apprentissage de Qt5 et je parcours assidument le livre créer des applications graphiques avec Qt5
    j'ai reproduis un de leur code que j'ai aussi accomoder à ma sauce dans un autre projet et j'ai un drôle de résultat.
    Dans le code ci dessous quand je quitte le fichier en faisant clique fichier clique quitter j'ai deux fois la demande de confirmation qui apparait. Chose que je n'ai pas en cliquant sur le X de fermeture de la fenêtre
    Dans un autre projet en remplacant le triggered par clicked sur 2 tools buttons j'ai le même comportement su un des deux objets :s LE code utilisé à cette occasion est une projection du code ci dessous. Je suis très novice e QT5 beotien en OO amateur passionné découvrant python.
    Merci


    start_app.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import sys
    from PyQt5.QtWidgets import QApplication
    from main_window_biblio import MainWindowBiblio
     
    app=QApplication(sys.argv)
    mainWindowBiblio=MainWindowBiblio()
    mainWindowBiblio.show()
     
    rc=app.exec_()
     
    sys.exit(rc)
    Ui_main_window_biblio.py
    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
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'C:\Users\chris\Documents\Script Python\main_window_biblio.ui'
    #
    # Created by: PyQt5 UI code generator 5.14.2
    #
    # WARNING! All changes made in this file will be lost!
     
     
    from PyQt5 import QtCore, QtGui, QtWidgets
     
     
    class Ui_MainWindowBiblio(object):
        def setupUi(self, MainWindowBiblio):
            MainWindowBiblio.setObjectName("MainWindowBiblio")
            MainWindowBiblio.resize(800, 722)
            self.centralWidget = QtWidgets.QWidget(MainWindowBiblio)
            self.centralWidget.setObjectName("centralWidget")
            self.verticalLayout = QtWidgets.QVBoxLayout(self.centralWidget)
            self.verticalLayout.setObjectName("verticalLayout")
            self.treeViewBd = QtWidgets.QTreeView(self.centralWidget)
            self.treeViewBd.setObjectName("treeViewBd")
            self.verticalLayout.addWidget(self.treeViewBd)
            self.groupBox = QtWidgets.QGroupBox(self.centralWidget)
            self.groupBox.setObjectName("groupBox")
            self.gridLayout = QtWidgets.QGridLayout(self.groupBox)
            self.gridLayout.setObjectName("gridLayout")
            self.label = QtWidgets.QLabel(self.groupBox)
            self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
            self.label.setObjectName("label")
            self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
            self.lineEditTitreBD = QtWidgets.QLineEdit(self.groupBox)
            self.lineEditTitreBD.setObjectName("lineEditTitreBD")
            self.gridLayout.addWidget(self.lineEditTitreBD, 0, 1, 1, 1)
            self.label_2 = QtWidgets.QLabel(self.groupBox)
            self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
            self.label_2.setObjectName("label_2")
            self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
            self.horizontalLayout = QtWidgets.QHBoxLayout()
            self.horizontalLayout.setObjectName("horizontalLayout")
            self.comboBoxGenre = QtWidgets.QComboBox(self.groupBox)
            self.comboBoxGenre.setObjectName("comboBoxGenre")
            self.comboBoxGenre.addItem("")
            self.comboBoxGenre.addItem("")
            self.comboBoxGenre.addItem("")
            self.comboBoxGenre.addItem("")
            self.comboBoxGenre.addItem("")
            self.horizontalLayout.addWidget(self.comboBoxGenre)
            spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
            self.horizontalLayout.addItem(spacerItem)
            self.gridLayout.addLayout(self.horizontalLayout, 1, 1, 1, 1)
            self.label_3 = QtWidgets.QLabel(self.groupBox)
            self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
            self.label_3.setObjectName("label_3")
            self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
            self.plainTextEditResume = QtWidgets.QPlainTextEdit(self.groupBox)
            self.plainTextEditResume.setObjectName("plainTextEditResume")
            self.gridLayout.addWidget(self.plainTextEditResume, 2, 1, 1, 3)
            self.label_4 = QtWidgets.QLabel(self.groupBox)
            self.label_4.setObjectName("label_4")
            self.gridLayout.addWidget(self.label_4, 3, 2, 1, 1)
            self.spinBox = QtWidgets.QSpinBox(self.groupBox)
            self.spinBox.setMaximum(5)
            self.spinBox.setObjectName("spinBox")
            self.gridLayout.addWidget(self.spinBox, 3, 3, 1, 1)
            self.verticalLayout.addWidget(self.groupBox)
            self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
            self.horizontalLayout_2.setObjectName("horizontalLayout_2")
            spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
            self.horizontalLayout_2.addItem(spacerItem1)
            self.pushButtonNouveau = QtWidgets.QPushButton(self.centralWidget)
            self.pushButtonNouveau.setObjectName("pushButtonNouveau")
            self.horizontalLayout_2.addWidget(self.pushButtonNouveau)
            spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
            self.horizontalLayout_2.addItem(spacerItem2)
            self.pushButtonSauvegarder = QtWidgets.QPushButton(self.centralWidget)
            self.pushButtonSauvegarder.setObjectName("pushButtonSauvegarder")
            self.horizontalLayout_2.addWidget(self.pushButtonSauvegarder)
            spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
            self.horizontalLayout_2.addItem(spacerItem3)
            self.pushButtonSupprimer = QtWidgets.QPushButton(self.centralWidget)
            self.pushButtonSupprimer.setObjectName("pushButtonSupprimer")
            self.horizontalLayout_2.addWidget(self.pushButtonSupprimer)
            spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
            self.horizontalLayout_2.addItem(spacerItem4)
            self.verticalLayout.addLayout(self.horizontalLayout_2)
            MainWindowBiblio.setCentralWidget(self.centralWidget)
            self.menuBar = QtWidgets.QMenuBar(MainWindowBiblio)
            self.menuBar.setGeometry(QtCore.QRect(0, 0, 800, 26))
            self.menuBar.setObjectName("menuBar")
            self.menu_Fichier = QtWidgets.QMenu(self.menuBar)
            self.menu_Fichier.setObjectName("menu_Fichier")
            MainWindowBiblio.setMenuBar(self.menuBar)
            self.action_Ouvrir = QtWidgets.QAction(MainWindowBiblio)
            self.action_Ouvrir.setObjectName("action_Ouvrir")
            self.action_Enregistrer = QtWidgets.QAction(MainWindowBiblio)
            self.action_Enregistrer.setObjectName("action_Enregistrer")
            self.action_Quitter = QtWidgets.QAction(MainWindowBiblio)
            self.action_Quitter.setObjectName("action_Quitter")
            self.menu_Fichier.addAction(self.action_Ouvrir)
            self.menu_Fichier.addAction(self.action_Enregistrer)
            self.menu_Fichier.addSeparator()
            self.menu_Fichier.addAction(self.action_Quitter)
            self.menuBar.addAction(self.menu_Fichier.menuAction())
     
            self.retranslateUi(MainWindowBiblio)
            QtCore.QMetaObject.connectSlotsByName(MainWindowBiblio)
     
        def retranslateUi(self, MainWindowBiblio):
            _translate = QtCore.QCoreApplication.translate
            MainWindowBiblio.setWindowTitle(_translate("MainWindowBiblio", "BiblioT"))
            self.groupBox.setTitle(_translate("MainWindowBiblio", "Details"))
            self.label.setText(_translate("MainWindowBiblio", "Titre"))
            self.label_2.setText(_translate("MainWindowBiblio", "Genre"))
            self.comboBoxGenre.setItemText(0, _translate("MainWindowBiblio", "Comics"))
            self.comboBoxGenre.setItemText(1, _translate("MainWindowBiblio", "---"))
            self.comboBoxGenre.setItemText(2, _translate("MainWindowBiblio", "Comics"))
            self.comboBoxGenre.setItemText(3, _translate("MainWindowBiblio", "Européenne"))
            self.comboBoxGenre.setItemText(4, _translate("MainWindowBiblio", "Manga"))
            self.label_3.setText(_translate("MainWindowBiblio", "Résumé"))
            self.label_4.setText(_translate("MainWindowBiblio", "Note"))
            self.pushButtonNouveau.setText(_translate("MainWindowBiblio", "Nouveau"))
            self.pushButtonSauvegarder.setText(_translate("MainWindowBiblio", "Sauvegarder"))
            self.pushButtonSupprimer.setText(_translate("MainWindowBiblio", "Supprimer"))
            self.menu_Fichier.setTitle(_translate("MainWindowBiblio", "&Fichier"))
            self.action_Ouvrir.setText(_translate("MainWindowBiblio", "&Ouvrir"))
            self.action_Ouvrir.setShortcut(_translate("MainWindowBiblio", "Ctrl+O"))
            self.action_Enregistrer.setText(_translate("MainWindowBiblio", "&Enregistrer"))
            self.action_Enregistrer.setShortcut(_translate("MainWindowBiblio", "Ctrl+S"))
            self.action_Quitter.setText(_translate("MainWindowBiblio", "&Quitter"))
     
     
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        MainWindowBiblio = QtWidgets.QMainWindow()
        ui = Ui_MainWindowBiblio()
        ui.setupUi(MainWindowBiblio)
        MainWindowBiblio.show()
        sys.exit(app.exec_())
    main_window_biblio.py
    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
    #main_window_biblio
    from PyQt5.QtWidgets import QMainWindow
    from Ui_main_window_biblio import Ui_MainWindowBiblio
    from PyQt5.QtWidgets import QFileDialog,  QMessageBox
    from PyQt5.QtCore import pyqtSlot,  QDate
    from Ui_main_window_biblio import Ui_MainWindowBiblio
    from modele_biblio import Livre, ModeleTableBiblio
     
    class MainWindowBiblio(QMainWindow, Ui_MainWindowBiblio):
     
            def __init__(self, parent=None):
                super(MainWindowBiblio, self).__init__(parent)
                self.setupUi(self)
                livresTest =[Livre('XIII', 'Comics','', ''), Livre('Tintin', 'Européenne', '', '')]
                self.modeleTableBiblio = ModeleTableBiblio(livresTest)
                self.treeViewBd.setModel(self.modeleTableBiblio)
                self.treeViewBd.selectionModel().selectionChanged.connect(self.on_treeViewBd_selectionChanged)
     
            def on_treeViewBd_selectionChanged(self, selected, deselected):
                indexesSelection=selected.indexes()
                if len(indexesSelection)>0:
                    self.indexSelection=indexesSelection[0]
                    self.indiceLivreSelectionne=self.indexSelection.row()
                    self.afficheLivre(self.modeleTableBiblio.livres[self.indiceLivreSelectionne])
     
            def afficheLivre(self, livre):
                self.lineEditTitreBD.setText(livre.titre)
                self.comboBoxGenre.setCurrentText(livre.genre)
                self.plainTextEditResume.setPlainText(livre.genre)
     
     
     
     
            @pyqtSlot()
            def on_action_Ouvrir_triggered(self):
                (nomFichierBiblio, filtre)= QFileDialog.getOpenFileName(self, "ouvrir fichier bibliotheque", filter="Bibliotheque (*.bib);;Tout(*.*)")
                if nomFichierBiblio:
                    QMessageBox.information(self, "Trace", "Fichier à ouvrir:\n\n%s"%nomFichierBiblio)
     
            def on_action_Quitter_triggered(self):
                self.close()
     
            def closeEvent(self, event):
                messageConfirmation= "Etes vous sûr de quitter BibliApp ?"
                reponse=QMessageBox.question(self, "Confirmation", messageConfirmation, QMessageBox.Yes, QMessageBox.No)
                if reponse == QMessageBox.Yes:
                    event.accept()
                else:
                    event.ignore()
    modele_biblio.py
    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
    from PyQt5.QtCore import Qt, QAbstractTableModel, QModelIndex, QVariant
    from collections import namedtuple
     
    Livre = namedtuple('Livre', ('titre','genre','resume', 'prix') )
    class ModeleTableBiblio(QAbstractTableModel):
        def __init__(self, livres):
            super(ModeleTableBiblio, self).__init__()
            self.titresColonnes=('titre','genre')
            self.livres=livres
        def headerData(self,section,orientation,role):
            if role == Qt.DisplayRole and orientation == Qt.Horizontal:
                return self.titresColonnes[section]
            return QVariant()
     
        def columnCount(self,parent):
            return len(self.titresColonnes)
     
        def rowCount(self,parent):
            return len(self.livres)
     
        def data(self,index,role):
            if role == Qt.DisplayRole and index.isValid():
                return (self.livres[index.row()][index.column()])
            return QVariant()
    Merci encore pour aide et votre patience

  2. #2
    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,

    Dans ta fonction closeEvent, à la place de event.accept() utilise plutôt QMainWindow.closeEvent(self, event) qui me semble plus approprié.

  3. #3
    Membre averti
    Homme Profil pro
    debutant
    Inscrit en
    Mai 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : debutant

    Informations forums :
    Inscription : Mai 2020
    Messages : 13
    Par défaut
    Merci pour ton aide

    même résultat après modification

  4. #4
    Membre averti
    Homme Profil pro
    debutant
    Inscrit en
    Mai 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : debutant

    Informations forums :
    Inscription : Mai 2020
    Messages : 13
    Par défaut
    Si j ajoute dans le fichier : main_window_biblio.py

    a la ligne 39 un autre @pyqtSlot(), juste avant la fonction def on_action_Quitter_triggered(self):

    cela fonctionne normalement ....

    Dois je en conclure qu'il faille systématiquement mettre un @pyqtslot() avant chaque gestion d'évenement lié à une action clic ou autre de l'utilisateur ?

Discussions similaires

  1. Actions suite au clic d'un bouton
    Par ping599 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 02/03/2017, 14h20
  2. Action suite clic sur zone image
    Par Nanit6 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/07/2012, 09h42
  3. [WD10] Exécuter une action suite au clic de la souris
    Par lepirate dans le forum WinDev
    Réponses: 1
    Dernier message: 07/02/2008, 22h35
  4. Réponses: 6
    Dernier message: 15/05/2006, 17h03
  5. [servlet] Action suite à accès sur chemin variable ?
    Par joseph_p dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 24/03/2006, 09h34

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