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_())