⇨ MENU ⇨ MODULES ⇨ tkinter ⇨ extension ttk ⇨ Treeview
Tutoriel de tkinter.ttk.Treeview ( )
⇨ MENU ⇨ MODULES ⇨ tkinter ⇨ extension ttk ⇨ Treeview
Tutoriel de tkinter.ttk.Treeview ( )
DESCRIPTION.
Créer une nouvelle arborescence graphique d'éléments avec présentation possible en tableau (widget : tkinter.ttk.Treeview ( )).
SYNTAXE.
TRV_Tableau = tkinter.ttk.Treeview ( parent , attribut1 = valeur , ... , attributn = valeur )
TRV_Tableau = ⇨ affectation de l'instance du controle [ optionnel ]
tkinter.ttk.Treeview ( ) ⇨ création d'une instance de tkinter.ttk.Treeview ( ) [ OBLIGATOIRE ]
parent ⇨ conteneur de l'instance de tkinter.ttk.Treeview ( ) [ OBLIGATOIRE ]
attribut = valeur ⇨ attribut à modifier avec sa nouvelle valeur [ optionnel ]
PRESENTATION DES ARBORESCENCES ET TABLEAUX.
La classe tkinter.ttk.Treeview ( ) n'est pas native du module tkinter, il faut donc commencer par importer le module d'extension tkinter.ttk pour pouvoir utiliser cette classe. Voir import pour plus de détails sur l'incorporation de modules, classes et méthodes non built-in dans un script.
Les objets du type tkinter.ttk.Treeview ( ) affiche des éléments de façon hiérarchique et permet de les présenter sous la forme d'arborescence, ou de tableau, pour les parcourir. D'une grande flexibilité, ils autorisent de une variété de personnalisation pour s'adapter à un large éventail de situations.
Un élément (ligne) est composé :
- d'une chaîne de caractères obligatoire (étiquette ou entête) ;
- d'une image facultative ;
- d'une liste de données facultative.
Les éléments sont présentés les uns en dessous des autres. Chaque élément est affiché sur une ligne avec l'entête en premier (colonne "#0") suivie des données de l'élément, chaqu'une dans une colonne. La première colonne, obligatoire, est identifiée par l'Id "#0" et ne doit pas être définie à la création.
Si des données doivent être affichées, dans des colonnes, à la suite de l'entête dans la colonne "#0", elles doivent être définis à la création, avec l'attribut columns dans un tuple ( ). L'Id des colonnes supplémentaires sont des chaînes de caractères choisies par l'utilisateur.
Les éléments d'une arborescence doivent recevoir un nom, ou identifiant, unique, ils pourront être générés automatiquement, ou définis par le script. Un élément représente un nœud dans l'arbre. Depuis nœud, dit interne, peuvent partir d'autres nœuds. Quand un nœud ne contient pas d'autres nœuds on le désigne par nœud feuille. Le nœud racine est créer en même temps que l'arborescence et est toujours identifié par un str ( ) vide : "", il n'est pas visible dans l’arborescence mais reste toujours vivant.
Les objets permanents de type tkinter.ttk.Treeview ( ) sont identifiés dans le site par : TRV_.
Voir les conventions sur les variables utilisées dans ce site ...
GENERALITES.
Pour créer un nouvel élément on utilise la méthode tkinter.ttk.Treeview ( ).insert ( ). on précisera alors sont emplacement dans l'arborescence en désignant son parent et son rang dans la liste des enfants du parent. L’ancêtre de tous les éléments est le nœud racine. Le rang d'un élément est indiqué par l'index de l'enfant, 0 étant le premier index et "end" insère après tous les enfants déjà existants.
Si les élément sont nommés, d'autres options seront disponible, tel que : ajouter une image à côté du nom, indiquer si le nœud sera ouvert ou fermé, ....
Avec la méthode tkinter.ttk.Treeview ( ).move ( ) un élément peut être redirigé, avec tous ses enfants, vers un autre emplacement, en indiquant un nœud parent et une position dans sa liste d'enfants. Le nouveau nœud parent ne ne doit pas être un des enfants de l'élément déplacé.
La méthode tkinter.ttk.Treeview ( ).delete ( ) supprime définitivement un élément. Alors que la méthode tkinter.ttk.Treeview ( ).detach ( ) retire un élément de l'arborescence sans le détruire. Il pourra ainsi être affiché de nouveau avec la méthode tkinter.ttk.Treeview ( ).move ( ).
Un élément peut fournir une ou plusieurs données complémentaires qui seront présentées à sa droite dans des colonnes identifiées par des noms définis lors de la création de l'arborescence graphique avec son attribut columns. L'aspect des colonnes sera configuré individuellement avec la méthode tkinter.ttk.Treeview ( ).columns ( ).
Des balises pourront être définies avec la méthode tkinter.ttk.Treeview ( ).tag_configure ( ) et utilisées avec l'attribut tags de la méthode tkinter.ttk.Treeview ( ).insert ( ) pour modifier l'aspect du contenu de chaque élément pour les distinguer des autres ou les regrouper par affinités
Les nouveaux événements : <<TreeviewSelect>>, <<TreeviewOpen>> et <<TreeviewClose>> pourront être surveillés pour permettre à l'utilisateur d'interagir avec les éléments contenu dans l'arborescence.
PRESENTATION DES ELEMENTS EN ARBORESCENCE.
# 01 : Importation du module tkinter et de son module d'extension tkinter.ttk,
# 01 : sans écrasement des controles standards du module tkinter
import tkinter , tkinter.ttk
# 02 : Création de la fenêtre principale de l'interface graphique de l'application,
TKI_Principal = tkinter.Tk ( )
# 03 : Création d'un bouton de commande standard permettant de quitter le programme.
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy )
# 04 : Création d'une arborescence graphique issue du module d'extension tkinter.ttk, nommée TRV_Sifi.
# 04 : Ce controle a comme parent, ou conteneur, la fenêtre principale de l'interface graphique.
# 04 : Le controle TRV_Sifi aura une unique colonne : la colonne d'entête #0, qui ne doit pas être définie,
TRV_Sifi = tkinter.ttk.Treeview ( TKI_Principal )
# 05 : La colonne d'entête, id "#0", aura 500 pixels de largeur.
TRV_Sifi.column ( "#0" , width = 500 )
# 06 : Configuration de la ligne recevant les entêtes de colonnes :
# 06 : - l'attribut text permet de donner une étiquette à la colonne ;
# 06 : - l'attribut anchor positionne l'étiquette.
TRV_Sifi.heading ( "#0" , text = "Franchises" , anchor = "center" )
# 07 : Insertion des éléments dans l’arborescence grâce à la méthode .insert ( ) , on indique :
# 07 : - depuis quelle colonne on insert un élément ("" pour la racine) ;
# 07 : - la ligne où on insert un élément (1 pour la première) ;
# 07 : - un nom pour cet élément, un str ( ) quelconque ;
# 07 : - le texte à placer dans l'élément, colonne à id "#0", obligatoire ;
TRV_Sifi.insert ( "" , 1 , "Sagas" , text = "Les sagas de Science fiction ..." )
TRV_Sifi.insert ( "" , 2 , "Personnalités" , text = "Les créateurs de Science fiction ..." )
# 08 : Insertion des sagas dans l'élément nommé Sagas.
# 08 : ils seront placés dans la première colonne juste en desous
# 08 : de l'élément nommé Sagas avec un léger retrait , on indique :
# 08 : - la ligne où on insert un élément "end" pour les placer en dessous du précédent ;
# 08 : - un nom pour cet élément, un str ( ) quelconque ;
# 08 : - le texte à placer dans l'élément, colonne à id "#0", obligatoire ;
TRV_Sifi.insert ( "Sagas" , "end" , "StarsTrek" , text = "Stars Trek ( ST ) ..." )
TRV_Sifi.insert ( "Sagas" , "end" , "StarWars" , text = "Star Wars ( ST ) ..." )
TRV_Sifi.insert ( "Sagas" , "end" , "StarGate" , text = "Stargate ( SG ) ..." )
# 09 : Insertion des autres éléments pour créer l'arborescence de la saga Star Trek.
# 09 : Développement incomplet mais simplifié pour l'exemple.
# 09 : Les noeuds StarWars et StarGate ne seront développés ici.
TRV_Sifi.insert ( "StarsTrek" , "end" , "ST_Series" , text = "ST : Les séries ..." )
TRV_Sifi.insert ( "ST_Series" , "end" , "ST_STO" , text = "Star Trek : Original ..." )
TRV_Sifi.insert ( "ST_STO" , "end" , "ST_STO-S01" , text = "STO : Saison 01 ..." )
TRV_Sifi.insert ( "ST_STO-S01" , "end" , "ST_STO-S01E1" , text = "STO : 0101 La Cage" )
TRV_Sifi.insert ( "ST_STO-S01" , "end" , "ST_STO-S01E2" , text = "STO : 0102 Ils étaient des millions" )
TRV_Sifi.insert ( "ST_STO-S01" , "end" , "ST_STO-S01E3" , text = "STO : 0103 Charlie X" )
TRV_Sifi.insert ( "ST_STO-S01" , "end" , "ST_STO-S01E4" , text = "STO : 0104 Où l'homme dépasse l'homme" ) # ... etc
TRV_Sifi.insert ( "ST_STO" , "end" , "ST_STO-S02" , text = "STO : Saison 02 ..." )
TRV_Sifi.insert ( "ST_STO-S02" , "end" , "ST_STO-S022E1" , text = "STO : 0201 Le Mal du pays" )
TRV_Sifi.insert ( "ST_STO-S02" , "end" , "ST_STO-S022E2" , text = "STO : 0202 Pauvre Apollon" ) # ... etc
TRV_Sifi.insert ( "ST_Series" , "end" , "ST_STD" , text = "Star Trek : Phase II ..." )
TRV_Sifi.insert ( "ST_Series" , "end" , "ST_TNG" , text = "Star Trek : The Next Generation ..." )
TRV_Sifi.insert ( "ST_TNG" , "end" , "ST_TNG-S01" , text = "TNG : Saison 01 ..." )
TRV_Sifi.insert ( "ST_TNG" , "end" , "ST_TNG-S02" , text = "TNG : Saison 02 ..." )
TRV_Sifi.insert ( "ST_TNG" , "end" , "ST_TNG-S03" , text = "TNG : Saison 03 ..." )
TRV_Sifi.insert ( "ST_TNG" , "end" , "ST_TNG-S04" , text = "TNG : Saison 04 ..." )
TRV_Sifi.insert ( "ST_TNG" , "end" , "ST_TNG-S05" , text = "TNG : Saison 05 ..." )
TRV_Sifi.insert ( "ST_TNG" , "end" , "ST_TNG-S06" , text = "TNG : Saison 06 ..." )
TRV_Sifi.insert ( "ST_TNG" , "end" , "ST_TNG-S07" , text = "TNG : Saison 07 ..." )
TRV_Sifi.insert ( "ST_Series" , "end" , "ST_DSN" , text = "Star Trek : Deep Space Nine ..." )
TRV_Sifi.insert ( "ST_Series" , "end" , "ST_VOY" , text = "Star Trek : Voyager ..." )
TRV_Sifi.insert ( "ST_Series" , "end" , "ST_ENT" , text = "Star Trek : Entreprise ..." )
TRV_Sifi.insert ( "ST_Series" , "end" , "ST_DIS" , text = "Star Trek : Discovery ..." )
TRV_Sifi.insert ( "ST_Series" , "end" , "ST_PIC" , text = "Star Trek : Picard ..." )
TRV_Sifi.insert ( "ST_Series" , "end" , "ST_SNW" , text = "Star Trek : Strange New Worlds ..." )
TRV_Sifi.insert ( "StarsTrek" , "end" , "ST_Films" , text = "ST : Les films ..." )
TRV_Sifi.insert ( "ST_Films" , "end" , "ST_F01" , text = "Star Trek : The Motion Picture" )
TRV_Sifi.insert ( "ST_Films" , "end" , "ST_F02" , text = "Star Trek : The Wrath of Khan" )
TRV_Sifi.insert ( "ST_Films" , "end" , "ST_F03" , text = "Star Trek : The Search for Spock" )
TRV_Sifi.insert ( "ST_Films" , "end" , "ST_F04" , text = "Star Trek : The Voyage Home" )
TRV_Sifi.insert ( "ST_Films" , "end" , "ST_F05" , text = "Star Trek : The Final Frontie" )
TRV_Sifi.insert ( "ST_Films" , "end" , "ST_F06" , text = "Star Trek : The Undiscovered Country" )
TRV_Sifi.insert ( "StarsTrek" , "end" , "ST_Animes" , text = "ST : Les animations ..." )
TRV_Sifi.insert ( "ST_Animes" , "end" , "ST_TAS" , text = "Star Trek : La série animée" )
TRV_Sifi.insert ( "ST_Animes" , "end" , "ST_LDX" , text = "Star Trek : Lower Decks" )
TRV_Sifi.insert ( "ST_Animes" , "end" , "ST_STP" , text = "Star Trek : Prodigy" )
TRV_Sifi.insert ( "StarsTrek" , "end" , "ST_Livre" , text = "ST : Les livres ..." )
TRV_Sifi.insert ( "ST_Livre" , "end" , "ST_LIV" , text = "Star Trek : à développer ..." )
# 10 : Mise en place des controles dans leur conteneur, c'est-à-dire la fenetre principale.
TRV_Sifi.pack ( )
BUT_Quitter.pack ( )
# 11 : Lancement du gestionnaire d'événement.
TKI_Principal.mainloop ( )
PRESENTATION DES ELEMENTS EN TABLEAU.
# 01 : Importation du module tkinter et de son module d'extension tkinter.ttk,
# 01 : sans écrasement des controles standards du module tkinter
import tkinter , tkinter.ttk
# 02 : Création de la fenêtre principale de l'interface graphique de l'application,
TKI_Principal = tkinter.Tk ( )
# 03 : Création d'un bouton de commande standard permettant de quitter le programme.
BUT_Quitter = tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy )
# 04 : Création d'une arborescence graphique issue du module d'extension tkinter.ttk, nommée TRV_Pays.
# 04 : Ce controle a comme parent, ou conteneur, la fenêtre principale de l'interface graphique.
# 04 : Le controle TRV_Pays aura 5 colonnes : la colonne d'entête #0, qui ne doit pas être définie,
# 04 : et 4 autres colonnes identifiée par Capitale, Superficie, Habitants et Continent.
TRV_Pays = tkinter.ttk.Treeview ( TKI_Principal , columns = ( "Capitale" , "Superficie" , "Habitants" , "Continent" ) )
# 05 : La colonne d'entête, id "#0", aura 150 pixels de largeur (width = 150)
# 05 : et ne pourra pas être redimensionnée (stretch = True).
TRV_Pays.column ( "#0" , width = 150 , stretch = True )
# 06 : Configuration des colonnes Capitale, Superficie, Habitants et Continent :
# 06 : - taille initiale de leur largeur en pixel avec l'attribut width ;
# 06 : - taille minimale en cas de redimensionnement avec l'attribut minwidth ;
# 06 : - autorisation de redimensionnement avec stretch = False.
TRV_Pays.column ( "Capitale" , width = 100 , minwidth = 100 , stretch = False )
TRV_Pays.column ( "Superficie" , width = 100 , minwidth = 50 , stretch = False )
TRV_Pays.column ( "Habitants" , width = 75 , minwidth = 50 , stretch = False )
TRV_Pays.column ( "Continent" , width = 75 , minwidth = 50 , stretch = False )
# 07 : Configuration de la ligne recevant les entêtes de colonnes :
# 07 : - l'attribut text permet de donner une étiquette à la colonne ;
# 07 : - l'attribut anchor positionne l'étiquette.
TRV_Pays.heading ( "#0" , text = "Pays" , anchor = "w" )
TRV_Pays.heading ( "Capitale" , text = "Capitale" , anchor = "center" )
TRV_Pays.heading ( "Superficie" , text = "Km²" , anchor = "e" )
TRV_Pays.heading ( "Habitants" , text = "Population" , anchor = "e" )
TRV_Pays.heading ( "Continent" , text = "Continent" , anchor = "center" )
# 08 : Insertion des éléments dans l’arborescence grâce à la méthode .insert ( ) , on indique :
# 08 : - depuis quelle colonne on insert un élément ("" pour la racine) ;
# 08 : - la ligne où on insert un élément (1 pour la première) ;
# 08 : - un nom pour cet élément, un str ( ) quelconque ;
# 08 : - le texte à placer dans l'élément, colonne à id "#0", obligatoire ;
# 08 : - les valeur des autres colonnes de la l'élément, facultatif.
TRV_Pays.insert ( "" , 1 , "L01" , text = "Canada" , values = ( "Quebec" , "1 542 056" , "8 485 000" , "Amérique" ) )
TRV_Pays.insert ( "" , 2 , "L02" , text = "Suisse" , values = ( "Berne" , "41 285" , "8 544 000" , "Europe" ) )
TRV_Pays.insert ( "" , 3 , "L03" , text = "Union Européenne" )
TRV_Pays.insert ( "" , 4 , "L04" , text = "Andorre" , values = ( "Andore La Vielle" , "468" , "77 000" , "Europe" ) )
TRV_Pays.insert ( "" , 5 , "L05" , text = "Algerie" , values = ( "Alger" , "2 381 741" , "42 972 000" , "Afrique" ) )
TRV_Pays.insert ( "" , 6 , "L06" , text = "Maroc" , values = ( "Rabat" , "710 850" , "34 314 000" , "Afrique" ) )
TRV_Pays.insert ( "" , 7 , "L07" , text = "Liban" , values = ( "Beyrouth" , "10 452" , "6 100 000" , "Asie" ) )
# 09 : Insertion de sous-éléments dans l'élément nommé L03 ,
# 09 : ils seront placés dans la première colonne juste en desous
# 09 : de l'élément nommé L03 avec un léger retrait , on indique :
# 09 : la ligne où on insert un élément "end" pour les placer en dessous du précédent ;
# 09 : un nom pour cet élément, un str ( ) quelconque ;
# 09 : le texte à placer dans l'élément, colonne à id "#0", obligatoire ;
# 09 : les valeur des autres colonnes de la l'élément, facultatif.
TRV_Pays.insert ( "L03" , "end" , "L0301" , text = "Belgique" , values = ( "Bruxelles" , "30 688" , "11 476 000" , "Europe" ) )
TRV_Pays.insert ( "L03" , "end" , "L0302" , text = "France" , values = ( "Paris" , "632 734" , "67 795 000" , "Europe" ) )
TRV_Pays.insert ( "L03" , "end" , "L0303" , text = "Luxembourg" , values = ( "Luxembourg" , "2 586" , "613 000" , "Europe" ) )
# 10 : Mise en place des controles dans leur conteneur, c'est-à-dire la fenetre principale.
TRV_Pays.pack ( )
BUT_Quitter.pack ( )
# 11 : Lancement du gestionnaire d'événement.
TKI_Principal.mainloop ( )
DIMENSIONNER UN TABLEAUX D'ELEMENTS ET LUI ASSOCIER DES ASCENSSEURS.
La hauteur d'un objet de type tkinter.ttk.Treeview ( ) peut être modifiée avec son attribut height, mais sa largeur, ou longueur, ne le peut pas. En effet, la largeur d'une arborescence est égale à la somme des largeurs de ses colonnes. Si un tableau possède un nombre conséquent de colonnes, l’arborescence peut alors s'étendre sur une grande partie de l'interface graphique et lui donner un aspect très peu convivial.
C'est pourquoi, il préférable de disposer une arborescence, surtout si elle doit avoir plusieurs colonnes, dans un conteneur, avec ou sans titre, et d'utiliser le gestionnaire de placement tkinter.place ( ) pour le déposer dans ce conteneur. Comme il est alors probable que seule une partie du tableau sera alors visible, on pourra, devra, associer le tableau à des barres de défilement et les mettre, elles aussi, dans le conteneur parent du tableau.
Le gestionnaire de placement tkinter.place ( ) permet une gestion très précise et pertinente de l'espace d'un conteneur, mais en contrepartie nécessite plus d’investissement du programmeur pour la disposition et les dimensions des enfants dans leur parent. voir le gestionnaire de placement tkinter.place ( ) pour plus détails.
import tkinter , tkinter.ttk
TKI_Principal = tkinter.Tk ( )
FRM_Tableau = tkinter.Frame ( TKI_Principal , bd = 2 , relief = "ridge" , width = 400 , height = 300 )
TRV_Eleves = tkinter.ttk.Treeview ( FRM_Tableau , columns = ( "a" , "b" , "c" , "d" , "e" , "f" ) )
BAR_Droit = tkinter.Scrollbar ( FRM_Tableau )
BAR_Bas = tkinter.Scrollbar ( FRM_Tableau , orient = "horizontal" )
TRV_Eleves [ "xscrollcommand" ] = BAR_Bas.set
BAR_Bas [ "command" ] = TRV_Eleves.xview
TRV_Eleves [ "yscrollcommand" ] = BAR_Droit.set
BAR_Droit [ "command" ] = TRV_Eleves.yview
TRV_Eleves.place ( x = 5 , y = 5 , width = 365 , height = 265 )
BAR_Droit.place ( x = 375 , y = 5 , width = 20 , height = 265 )
BAR_Bas.place ( x = 5 , y = 275 , width = 365 , height = 20 )
TRV_Eleves.heading ( "#0" , text = "Nom" )
for knote in ( "abcdef" ) : TRV_Eleves.heading ( knote , text = knote.upper ( ) )
for keleve in range ( 30 ) : TRV_Eleves.insert ( "" , "end" , keleve , text = f"Eleve { keleve } ..." )
FRM_Tableau.pack ( )
tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy ).pack ( )
TKI_Principal.mainloop ( )
Votre aide est précieuse pour améliorer ce site, alors n'hésitez pas à faire part de