Bonjour, ou plutôt Bonsoir.
Je rencontre un petit souci qui commence à me faire tourner la tête totalement.
Dans mon code un appui sur un bouton rend un combobox éditable. Je récupère dans une liste la valeur de ce widget et de plusieurs autres. Après un deuxième appui sur le bouton cette liste est passée dans une fonction qui stocke chacune des valeurs de la liste dans un base de donnés SQlite.
Au rafraichissement de la fenêtre, je relis cette base de données et je crée une liste des valeurs de la colonne n°2 (la première étant l'id). Cette liste sert à mettre à jour le combobox ci-dessus. La sélection d'un item permettra de lire la ligne de la bdd correspondant à cet item.
Jusque là aucun souci, enfin presque...
Dans le cadre de mon projet l'utilisateur peut être mené à écrire une chaine de caractères dans le combobox comprenant un apostrophe... et là ça se complique.
Jusqu'à la mise à jour du combobox je ne rencontre aucun problème. Seulement lorsque je change la valeur du combobox, si cette valeur comporte un apostrophe, l'interrogation de la bdd plante.
Je ne trouve aucun moyen de résoudre le problème, alors si quelqu'un a une idée je suis preneur à 3000%.
Voici quelques morceaux de mon code :
Code Permettant d'enregistrer dans la bdd : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 def on_BtSalon_clicked(self): if self.BtSalon.text() == "Créer un nouveau salon": self.cbSalon.setEditable(True) self.BtSalon.setText("Enregistrer les modifications") elif self.BtSalon.text() == "Enregistrer les modifications": name_salon = self.cbSalon.currentText() + " " + self.EditVilleSalon.text()+ " (" + str(self.dtDebut.date().year()) \ + " - " + str(self.dtFin.date().year()) + ")" liste = [name_salon, self.dtDebut.date(), self.dtFin.date(), self.EditVilleSalon.text(), self.EditBudget.text(), self.EditDescriptif.text(), self.EditIntervenant.text(), self.EditInteret.text()] self.bdd.WriteTableSalon(liste)
Code Enregistrant dans la bdd : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 def WriteTableSalon(self, liste): model = QtSql.QSqlTableModel() model.setTable('salon') model.select() model.insertRows(0, 1) a = 0 while a <= 7: model.setData(model.index(0, a+1), liste[a]) a+=1 model.submitAll()
Code Permettant la lecture et la mise à jour du combobox : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 def ListeSalon(self): liste = [""] model = QtSql.QSqlTableModel() model.setTable("salon") model.select() nb_row = model.rowCount() a = 0 while a < nb_row: record = model.record(a) salon = record.value("salon") liste.append(salon) a +=1 liste.sort() return liste
Code Mettant le combobox à jour : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 def actuComboSalon(self, bdd): self.cbSalon.clear() self.cbSalon.addItems(bdd.ListeSalon())
Code exécuté au changement de la valeur du CB : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 def on_cbSalon_activated(self, p0): name_salon = self.cbSalon.currentText().encode('utf-8') liste = self.bdd.OpenSalon(name_salon)
Code Accédant à la ligne de la BDD correspond à l'item du CB : 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 def OpenSalon(self, salon): liste_ligne = [] model = QtSql.QSqlTableModel() model.setTable("salon") model.setFilter("""salon = '%s' """ %(salon)) model.select() nb_row = model.rowCount() a = 0 while a < nb_row: record = model.record(a) for i in lib_salon: salon = record.value(i) liste_ligne.append(salon) a += 1 return liste_ligne
Ne vous focalisé surtout pas sur des aspects comme l'indentation, ... Le code fonctionne bien jusqu'à la mise à jour du combobox et fonctionne parfaitement bien si l'item de celui-ci ne comporte pas d'apostrophe.
D'avance merci pour votre aide..
Partager