Formation PUB400 : Python, 2018 Opérations CRUD avec tkinter

10.6 Saisie des nouvelles informations dans un environnement graphique


Dans une application graphique, il est d'usage d'afficher les données originales dans des éléments graphiques de saisie, par exemple dans des widgets Entry.

L'usager n'aura pas besoin de saisir à nouveau les données de tous les champs. Il ne se préoccupera que de ceux dont les données doivent être modifiées et laissera les autres intacts.

Retrouver la ligne sélectionnée dans un TreeView

Prenons le cas où tous les champs à éditer sont affichés dans le TreeView. La fonction items() du TreeView retourne les informations affichées dans la ligne sélectionnée sous forme de dictionnaire, c'est-à-dire une série d'informations au format clé:valeur.

Cette fonction attend en paramètre la valeur du iid, que nous avons stockée dans la variable id.

Python

id = tableau.identify_row(event.y)

ligne_choisie = tableau.item(id) 

Si on fait afficher la variable ligne_choisie dans le débogueur, on obtient :

Débogueur

{'text': '', 'image': '', 'values': ['Cégep de Victoriaville'], 'open': 0, 'tags': ['enregistrement']}

Retrouver la valeur des champs de cette ligne

Il est maintenant possible de retouver chacun des champs affichés pour cet enregistrement.

Un dictionnaire, c'est comme un tableau. La différence, c'est qu'on utilisera une chaîne, et non un indice, pour identifier les éléments.

Remarquez les crochets carrés alentour de la valeur de l'élément values. Ils indiquent que cet élément contient un tableau. Dans l'exemple, ce sous-tableau ne contient qu'un seul élément. En fait, il y aura un élément par colonne affichée.

Ainsi, pour retrouver la valeur stockée dans le premier élément de la dimension 'values' :

Python

$description = ligne_choisie['values'][0])

Saisie des modifications

L'application peut maintenant utiliser ces informations pour initialiser les widgets Entry qui serviront à saisir les modifications désirées.

Dans cet exemple, j'ai choisi d'afficher les Entry dès le démarrage de l'application mais de les rendre actifs seulement lorsque l'usager aura cliqué sur une ligne du TreeView.

Python

...

 

def tableau_click(event):

    """Clic sur un item du tableau."""

 

 

    # la variable id est initialisée ici pour la première fois.

    # On doit la rendre globale pour qu'elle soit visible dans la fonction qui enregistre les modifications.

    global id   

 

    # ----------------------------------------------------------------------------

    # retrouve les données originales

    # ----------------------------------------------------------------------------

 

    id = tableau.identify_row(event.y)

    ligne_choisie = tableau.item(id)

    description_originale = ligne_choisie['values'][0]

    quantite_originale = ligne_choisie['values'][1]

 

    # ----------------------------------------------------------------------------

    # affiche les données dans les widgets de saisie

    # ----------------------------------------------------------------------------

    description.configure(state='enabled')   # active la boîte pour pouvoir modifier le texte

    description.delete(0, END)   # vide la boîte au cas où l'usager ferait plusieurs clics

    description.insert(END, description_originale)   # ajoute les données à la boîte

 

    quantite.configure(state='enabled')

    quantite.delete(0, END)

    quantite.insert(END, quantite_originale)

 

    description.focus_set()

    bouton_enregistrer.configure(state='enabled')

 

...

 

########## programme principal ##########

 

...

 

#tableau

tableau = Treeview(fenetre, columns=('description', 'quantite'))

tableau.heading('description', text='Description')

tableau.heading('quantite', text='Quantité')

tableau['show'] = 'headings' # sans ceci, il y avait une colonne vide à gauche qui a pour rôle d'afficher le paramètre "text" qui peut être spécifié lors du insert

tableau.tag_bind('enregistrement', '<Button-1>', tableau_click)

tableau.pack(padx = 10, pady = (0, 10))

 

# message

message = Label(fenetre, text = '')

message.pack(padx = 10, pady = (0, 10))

 

# saisie

libelle_description = Label(fenetre, text = 'Description',)

libelle_description.pack(padx = 10)

description = Entry(fenetre, state='disabled')

description.pack(padx = 10, pady = (0, 10))

 

libelle_quantite = Label(fenetre, text = 'Quantité')

libelle_quantite.pack(padx = 10)

quantite = Entry(fenetre, state='disabled')

quantite.pack(padx = 10, pady = (0, 10))

 

bouton_enregistrer = Button(fenetre, text = 'Enregistrer', command = enregistrer_click, state='disabled')

bouton_enregistrer.pack(padx = 10, pady = (0, 10))

 

# bouton pour terminer le programme

bouton_terminer = Button(fenetre, text = 'Terminer', command = fenetre.destroy)

bouton_terminer.pack(padx = 10, pady = (0, 10))

 

...

Update dans une application graphique

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre