Formation PUB400 : Python, 2018 Environnement graphique tkinter

9.18 Afficher des données en lignes et en colonnes avec le Treeview


Quand on travaille avec des données, il est intéressant de pouvoir faire un affichage en lignes et en colonnes. Avec tkinter, le widget Treeview est tout indiqué pour cette tâche.

Voici un exemple d'utilisation :

Python

#!/usr/bin/env python

 

from tkinter import *

from tkinter.ttk import *

import sqlite3

import sys

import traceback

 

# fenêtre principale

fenetre = Tk()

fenetre.title('Système scolaire')

 

# libellé

libelle = Label(fenetre, text = 'Étudiants')

libelle.pack(padx = 10, pady = 10)

 

#tableau

tableau = Treeview(fenetre, columns=('nomfamille', 'prenom', 'da'))

tableau.heading('nomfamille', text='Nom de famille')

tableau.heading('prenom', text='Prénom')

tableau.heading('da', text='DA')

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.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))

 

# lecture et affichage des données

try:

    connexion = None

    connexion = sqlite3.connect('file:systemescolaire.db?mode=rw', uri=True)

    curseur = connexion.cursor()

 

    requete = 'SELECT id, nomfamille, prenom, da FROM etudiants ORDER BY nomfamille, prenom'

    curseur.execute(requete)

    resultat = curseur.fetchall()

 

    if len(resultat):

        for enreg in resultat:

            # chaque ligne n'a pas de parent, est ajoutée à la fin de la liste, utilise le champ id comme identifiant et on fournit les valeurs pour chacune des colonnes du tableau

            tableau.insert('', 'end', iid=enreg[0], values=(enreg[1], enreg[2], enreg[3]))

    else:

        libelle.configure(text = 'Il n\'y a présentement aucun étudiant.')

        tableau.pack_forget()

 

except sqlite3.OperationalError as e:

    if not connexion:

        libelle.configure('La connexion à la base de données a échoué.')

    else:

        libelle.configure(text='Il y a une erreur dans la requête SQL.')

 

    traceback.print_exc(file=sys.stdout)

 

except Exception as e:

    libelle.configure(text='Une erreur inattendue est survenue.')

    traceback.print_exc(file=sys.stdout)

 

finally:

    if connexion:

        connexion.close()

 

# la fenêtre s'affiche puis attend les interactions de l'usager

fenetre.mainloop()

Exemple de Treeview

Voici quelques explications :

  • Lors de la création du Treeview, qui s'appelle ici tableau, on précise qu'il y aura 3 colonnes. On donne un nom à ces colonnes pour pouvoir les configurer individuellement.
    Python

    tableau = Treeview(fenetre, columns=('nomfamille', 'prenom', 'da'))

  • On précise ensuite le texte à affiche en haut de chacune des colonnes.
    Python

    tableau.heading('nomfamille', text='Nom de famille')

    tableau.heading('prenom', text='Prénom')

    tableau.heading('da', text='DA')

  • Le Treeview est conçu pour afficher un libellé suivi des données. Puisque nous ne sommes intéressés que par l'affichage des données, nous allons cacher la colonne qu'il avait prévue pour le libellé.
    Python

    tableau['show'] = 'headings'

  • Après avoir retrouvé les données à partir de la BD, nous les ajoutons au tableau.
    Python

    tableau.insert('', 'end', iid=enreg[0], values=(enreg[1], enreg[2], enreg[3]))

    • Le premier paramètre est laissé à blanc pour indiquer que la ligne ajoutée n'est pas un sous-ensemble d'une autre ligne.
    • Le second paramètre est à 'end' pour indiquer que la ligne doit être affichée à la fin de la liste.
    • Le troisième paramètre, iid, permet de préciser un identifiant pour la ligne. Il doit s'agir d'une information unique. On utilisera généralement la clé primaire. Ceci sera utile plus tard quand nous voudrons faire des opérations CRUD sur ces données.
    • Le quatrième paramètre, values, est un tuple qui précise les données à afficher dans chacune des colonnes. Il s'agit en fait des champs de l'enregistrement actuellement traité dans la boucle.
      Si le Treeview n'a qu'une seule colonne, n'oubliez pas la virgule terminale dans le tuple (ex : values=(variable,)) sinon, Python considèrera que le texte à afficher est lui-même un tuple et séparera les mots aux espaces.
    • Il aurait été possible d'ajouter un autre paramètre : text. C'est la valeur de ce paramètre qui aurait été affichée dans la toute première colonne, celle que nous avons choisi de cacher.
  • Comme dans toutes les applications qui travaillent avec une base de données, nous avons pris soin de placer la connexion et la requête dans un bloc try...except. Nous avons traité spécifiquement les exceptions dues à une erreur SQL ainsi que toutes les autres exceptions possibles. Nous avons également pris soin de réagir correctement dans le cas où la requête n'aurait retourné aucune donnée.

▼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