5. Touches finales
On a à présent une application qui permet de faire toutes les opérations attendues, y
compris la persistance sur fichier. Il y a cependant encore des points d'ergonomie à
améliorer. Le point le plus critique est sans doute qu'il n'y a pas de contrôle sur la
sauvegarde des données saisies [8] : l'utilisateur peut facilement oublier de cliquer sur le
bouton Sauvegarder et perdre les dernières saisies. De plus, ce bouton est toujours
activable, même si rien n'a été modifié dans les champs de saisie. Enfin, rien n'interdit
de créer des livres sans titre. Les problèmes d'ergonomie de ce type ne doivent pas être
sous-estimés ; ils peuvent faire la différence entre le prototype sympa et l'application
de production réellement utilisable. Nous allons terminer ce chapitre en expliquant
comment régler les quelques points signalés (il restera sans aucun doute encore bien
des choses à améliorer). Au passage, nous pourrons voir la puissance des connexions
signaux-slots à l'œuvre.
Dans ce qui suit, plutôt que d'introduire un nouvel attribut booléen indiquant si une
saisie est en cours au niveau des champs de détail, on va utiliser un petit artifice : le
bouton Sauvegarder va se charger lui-même de maintenir cette information. En testant
s'il est activable (via la méthode isEnabled), on saura si une saisie est en cours. Ce
dont il faut juste s'assurer, c'est de bien gérer l'état de ce bouton suivant les différentes
actions de l'utilisateur.
Note > Le fait de pouvoir interroger l'état des widgets est une faculté souvent sousutilisée par les programmeurs ; dans le cas présent, on l'exploite pour éviter d'avoir
à créer un attribut redondant qui risque, si on n'est pas rigoureux à 100 %, d'être
désynchronisé par rapport à l'état du bouton. Notons que cette technique pourrait
être utilisée par ailleurs pour supprimer l'attribut booléen fichierNonEnregistre,
sachant qu'il est toujours corrélé à l'état de actionEnregistrer.
Sur la base de cette idée, voyons les choses à modifier par rapport à l'implémentation
précédente (les points de suspension indiquent que les lignes qui suivent sont à ajouter
par rapport au listing donné précédent).
-*- coding: utf-8 -*# main_windows_biblio.py
from PyQt5.QtCore import pyqtSlot, QDate, QItemSelectionModel
…
128
On a à présent une application qui permet de faire toutes les opérations attendues, y
compris la persistance sur fichier. Il y a cependant encore des points d'ergonomie à
améliorer. Le point le plus critique est sans doute qu'il n'y a pas de contrôle sur la
sauvegarde des données saisies [8] : l'utilisateur peut facilement oublier de cliquer sur le
bouton Sauvegarder et perdre les dernières saisies. De plus, ce bouton est toujours
activable, même si rien n'a été modifié dans les champs de saisie. Enfin, rien n'interdit
de créer des livres sans titre. Les problèmes d'ergonomie de ce type ne doivent pas être
sous-estimés ; ils peuvent faire la différence entre le prototype sympa et l'application
de production réellement utilisable. Nous allons terminer ce chapitre en expliquant
comment régler les quelques points signalés (il restera sans aucun doute encore bien
des choses à améliorer). Au passage, nous pourrons voir la puissance des connexions
signaux-slots à l'œuvre.
Dans ce qui suit, plutôt que d'introduire un nouvel attribut booléen indiquant si une
saisie est en cours au niveau des champs de détail, on va utiliser un petit artifice : le
bouton Sauvegarder va se charger lui-même de maintenir cette information. En testant
s'il est activable (via la méthode isEnabled), on saura si une saisie est en cours. Ce
dont il faut juste s'assurer, c'est de bien gérer l'état de ce bouton suivant les différentes
actions de l'utilisateur.
Note > Le fait de pouvoir interroger l'état des widgets est une faculté souvent sousutilisée par les programmeurs ; dans le cas présent, on l'exploite pour éviter d'avoir
à créer un attribut redondant qui risque, si on n'est pas rigoureux à 100 %, d'être
désynchronisé par rapport à l'état du bouton. Notons que cette technique pourrait
être utilisée par ailleurs pour supprimer l'attribut booléen fichierNonEnregistre,
sachant qu'il est toujours corrélé à l'état de actionEnregistrer.
Sur la base de cette idée, voyons les choses à modifier par rapport à l'implémentation
précédente (les points de suspension indiquent que les lignes qui suivent sont à ajouter
par rapport au listing donné précédent).
-*- coding: utf-8 -*# main_windows_biblio.py
from PyQt5.QtCore import pyqtSlot, QDate, QItemSelectionModel
…
128
