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 :

setCurrentIndex vs currentIndexChanged


Sujet :

PyQt Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 50
    Points : 37
    Points
    37
    Par défaut setCurrentIndex vs currentIndexChanged
    Bonjour,

    Je rencontre un souci avec un formulaire écrit avec pyQt.

    Dans les grandes lignes,
    * il contient une ligne de texte "line_name", un champ date "dateEdit" et des combobox "cb_breed, cb_color, cb_sex"
    * une fonction "set_horse" permet de remplir les champs
    * une fonction "save_changes" permet d'enregistrer des modifications dans les champs

    ce script ne fonctionne pas et je pense savoir pourquoi sans savoir comment corriger le souci
    * la fonction d'enregistrement est appelé via des signaux, notamment le signal "currentIndexChanged" pour les combobox
    * la fonction "set_horse" modifie la valeur affichée dans les combobox en appelant une fonction "setCurrentIndex"

    A l'initialisation, ce script fonctionne bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        # OK
    #    widget = HorseDescriptionWidget(dtb, horse1)



    mais si j'utilise par la suite la fonction set_horse, les valeurs des combobox sont fausses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        # pas OK
        widget = HorseDescriptionWidget(dtb, None)
        widget.set_horse(horse1)
        # pas OK
    #    widget = HorseDescriptionWidget(dtb, horse2)
    #    widget.set_horse(horse1)
    mon explication de ce dysfonctionnement est la suivante
    * l'appel de la fonction set_horse utilise setCurrentIndex qui va indirectement généré un signal currentIndexChanged pour les combobox
    * le signal currentIndexChanged appel la fonction save_changes, les caractéristiques de l"objet sont enregistrés avec les champs de l'objet précédent (save_changes se réalise avant que set_horse ne soit réalisé)

    Est ce que ma compréhension de la situation est juste ?
    Avez vous une piste pour régler ce souci ?


    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
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Created on Thu Aug  6 16:50:04 2020
     
    @author: antoine
    """
     
    import sys
    from PyQt5 import uic
    from PyQt5.QtWidgets import QWidget
    from PyQt5.QtCore import QDate
     
    class HorseDescriptionWidget(QWidget):
        "widget to describe a horse"
     
        def __init__(self, studdb, horse = None):
            QWidget.__init__(self)
            uic.loadUi('./view/horse_description_widget.ui', self) # Load the .ui file
     
            self.dtb = studdb
            self.horse = horse
     
            # init combobox
            self.cb_breed.update(self.dtb, self.dtb.table_breed.get_breeds, obj=None)
            self.cb_color.update(self.dtb, self.dtb.table_color.get_colors, obj=None)
            self.cb_sex.update(self.dtb, self.dtb.table_sex.get_sexes, obj=None)
     
            # set horse
            self.set_horse(self.horse)
     
            #signals
            # mise à jour par pushbutton (supprimé)
            #self.pushButton.clicked.connect(self.save_changes)
            # mise à jour auto
            self.line_name.editingFinished.connect(self.save_changes)
            self.dateEdit.dateChanged.connect(self.save_changes)
            self.cb_breed.currentIndexChanged.connect(self.save_changes)
            self.cb_color.currentIndexChanged.connect(self.save_changes)
            self.cb_sex.currentIndexChanged.connect(self.save_changes)
     
     
        def save_changes(self):
            "update horse data"
            name = self.line_name.text()
            breed = self.cb_breed.get_obj()
            color = self.cb_color.get_obj()
            sex = self.cb_sex.get_obj()
     
            birthdate = self.dateEdit.date().toString("yyyy-MM-dd")
            print(name, breed, color, sex, birthdate)
    #        print(breed in self.dtb.table_breed.get_breeds())
     
            self.dtb.table_horse.update_horse(self.horse.dtb_id, name, sex.dtb_id,
                                              color.dtb_id, birthdate, breed.dtb_id)
     
        def set_horse(self, horse = None):
            "set horse to display"
            self.horse = horse
            # set horse in description tab
            if self.horse is not None :
                self.setEnabled(True)
                self.line_name.setText(self.horse.get_name())
                dob = self.horse.get_birthdate()
                self.dateEdit.setDate(QDate(dob.year, dob.month, dob.day))
     
                self.cb_breed.set_obj(self.horse.get_breed())
                self.cb_color.set_obj(self.horse.get_color())
                self.cb_sex.set_obj(self.horse.get_sex())
     
            else:
                self.setEnabled(False)
     
    if __name__ == '__main__':
        from PyQt5.QtWidgets import QApplication
        from model.studdb import StudDb
        from model.studdb import Horse
     
        app = QApplication(sys.argv)
        dtb = StudDb("/home/antoine/Bureau/studmanager/src/sample/demo.sqlite")
        #horse = dtb.table_horse.get_horses()[1]
        horse1 = Horse(dtb, 1)
        horse2 = Horse(dtb, 2)
        #*OK
    #    widget = HorseDescriptionWidget(dtb, horse1)
        # pas OK
        widget = HorseDescriptionWidget(dtb, None)
        widget.set_horse(horse1)
        # pas OK
    #    widget = HorseDescriptionWidget(dtb, horse2)
    #    widget.set_horse(horse1)
     
        widget.show()
        sys.exit(app.exec_())

  2. #2
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 50
    Points : 37
    Points
    37
    Par défaut
    problème résolu en bloquant les signaux temporairement dans la fonction set_horse

    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
        def set_horse(self, horse = None):
            "set horse to display"
     
            self.line_name.blockSignals(True)
            self.dateEdit.blockSignals(True)
            self.cb_breed.blockSignals(True)
            self.cb_color.blockSignals(True)
            self.cb_sex.blockSignals(True)
     
     
            self.horse = horse
            # set horse in description tab
            if self.horse is not None :
                self.setEnabled(True)
                self.line_name.setText(self.horse.get_name())
                dob = self.horse.get_birthdate()
                self.dateEdit.setDate(QDate(dob.year, dob.month, dob.day))
     
                self.cb_breed.set_obj(self.horse.get_breed())
                self.cb_color.set_obj(self.horse.get_color())
                self.cb_sex.set_obj(self.horse.get_sex())
     
            else:
                self.setEnabled(False)
     
            self.line_name.blockSignals(False)
            self.dateEdit.blockSignals(False)
            self.cb_breed.blockSignals(False)
            self.cb_color.blockSignals(False)
            self.cb_sex.blockSignals(False)

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

Discussions similaires

  1. Qtreeview - setCurrentIndex et sous item
    Par toitoinebzh dans le forum PyQt
    Réponses: 1
    Dernier message: 25/12/2019, 00h34
  2. SLOT(currentIndexChanged(int)) de QComboBox
    Par azboul dans le forum Débuter
    Réponses: 5
    Dernier message: 08/09/2010, 11h32

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