Mettre en page avec une fenêtre à panneaux

ghmesnil   23 mars 2016   Commentaires fermés sur Mettre en page avec une fenêtre à panneaux

Pour avoir une mise en page claire sur la fenêtre Tkinter, on peut utiliser une fenêtre à panneaux, dit en anglais PanedWindow (documentation sur ce sujet).

fenetreapanneaux

Le principe est le suivant :

Dans la fenêtre principale, on crée une fenêtre à panneaux, que nous appellerons ici Panneaux.

from tkinter import *


fenetre=Tk()
Panneaux=PanedWindow(fenetre,bg='#ffffff',bd='1px', height='200px', width='600px',orient='horizontal', sashwidth='2px')
Panneaux.pack()

Selon la valeur du paramètre orientation (horizontal ou vertical), les sous-fenêtres s’installent de gauche à droite ou de bas en haut. Ces sous-fenêtres peuvent être des Frame, des LabelFrame, ou tout autre widget.

Déclaration des sous-fenêtres

Ci-dessous, sont installés trois sous-fenêtres de type LabelFrame appelées Partie_gauche, Partie_centrale et Partie_droite. Pour chacune, on déclare le widget comme enfant de Panneaux. L’ordre de déclaration par la méthode add permet de gérer l’ordre de mise en place des sous-fenêtres dans Panneaux.

Partie_gauche=LabelFrame(Panneaux, bg='#ef1245', text='première fenêtre')
Partie_centrale=LabelFrame(Panneaux, bg='#dd4512', text='deuxième fenêtre')
Partie_droite=LabelFrame(Panneaux, bg='#457011', text='troisième fenêtre')
Panneaux.add(Partie_gauche)
Panneaux.add(Partie_centrale)
Panneaux.add(Partie_droite)

Par la suite, il est possible d’ajouter des widgets dans les différentes sous-fenêtres ainsi créées. L’ancrage de celles-ci se fait comme d’habitude avec une méthode, pack, grid ou place. Une même méthode doit être utilisée dans une même sous fenêtre. Mais on peut utiliser des méthodes différentes pour des sous-fenêtres différentes.

Text1=Label(Partie_gauche, text='voici un petit texte')
Text1.pack(padx='2px')
Text2=Label(Partie_centrale, text='voici un autre texte')
Text2.pack(padx='2px')
Text3=Label(Partie_droite,text='encore un...')
Text4=Label(Partie_droite, text='et voila !')
Text3.grid(row=0,column=0)
Text4.grid(row=1,column=1)

fenetre.mainloop()

Configuration des sous-fenêtres

La configuration des sous-fenêtres d’une fenêtre à panneaux se fait au niveau de la méthode add. On peut ainsi paramétrer la hauteur, la largeur, l’espace autour de la sous-fenêtre et aussi l’emplacement d’une sous fenêtre par rapport à une autre (voir documentation complète).

Panneaux.add(Partie_gauche, width='200px', padx='5px')
Panneaux.add(Partie_centrale, width='200px', padx='2px')
Panneaux.add(Partie_droite, width='200px',before=Partie_gauche)

Les paramètres de configuration des sous-fenêtres sont aussi modifiables de manière dynamique à l’intérieur des fonctions du programme : Dans l’exemple ci-dessous, on ajoute un bouton qui va permettre de déplacer aléatoirement les fenêtres les unes par rapport aux autres.

Définition du bouton Bouton dans la partie Tkinter du programme :

Bouton=Button(fenetre, text='déplacer',command=deplace)
Bouton.pack(side=LEFT, pady='2px', padx='5px')

Description de la fonction deplace() :

from random import *

def deplace():
    c=randint(1,3)
    if c==1:
        Panneaux.paneconfig(Partie_droite,before=Partie_centrale)
    elif c==2:
        Panneaux.paneconfig(Partie_centrale,after=Partie_gauche)
    else:
        Panneaux.paneconfig(Partie_gauche,before=Partie_droite)

Autres méthodes pour une fenêtre à panneaux

Outre  add(), il existe d’autres méthodes applicables aux fenêtres à panneaux (Toute la documentation est ici). Notons cependant deux méthodes importantes :

  • .panes() : Cette méthode permet d’avoir la liste des sous-fenêtres de la fenêtre à panneaux.

Dans le programme précédent, on peut rajouter à la fin de la fonction deplace() les lignes suivantes pour s’en rendre compte et observer l’affichage dans le panneaux de contrôle.

print('la liste des sous-fenêtres est :',Panneaux.panes())
print("l'identifiant de Partie_gauche est le nombre :", Partie_gauche)
print("on teste si Partie_gauche est une sous_fenêtre de Panneaux :" str(Partie_gauche) in Panneaux.panes())
  • .forget() : Cette méthode permet de supprimer des sous-feêntres. Il faut  cependant faire attention à ce que la sous-fenêtre est bien affichée (d’où l’utilité de la méthode précédente).

Notons que .remove() est la même méthode que .forget().

Cela peut-être très utile si on veut faire un logiciel avec une fenêtre d’accueil et des panneaux qui varient selon l’avancement du programme. Dans ce cas, les méthodes forget() et add() et panes() seront les bienvenues.

Le bout de programme suivant permet de créer deux autres boutons à notre programme en court. Le premier supprime et ajoute des sous-fenêtres de manière aléatoire. Le suivant remet les sous-fenêtres dans l’état initial (Attention à ne pas utiliser le bouton « Déplacer » lorsqu’il n’y a pas trois sous_fenêtres).

Description des boutons pour la partie Tkinter

Bouton2=Button(fenetre, text='ajouter ou supprimer', command=ajout)
Bouton2.pack(side=LEFT,pady='2px',padx='5px')
Bouton3=Button(fenetre,text='tout rétablir',command=reinit)
Bouton3.pack(side=LEFT,pady='2px',padx='5px')

Description des fonctions appelées par ces boutons

def ajout():
 c=randint(1,3)
   if c==1:
     if str(Partie_gauche) in Panneaux.panes():
       Panneaux.forget(Partie_gauche)
     else:
       Panneaux.add(Partie_gauche)
   elif c==2:
     if str(Partie_centrale) in Panneaux.panes():
       Panneaux.forget(Partie_centrale)
     else:
       Panneaux.add(Partie_centrale)
   else:
     if str(Partie_droite) in Panneaux.panes():
       Panneaux.forget(Partie_droite)
     else:
       Panneaux.add(Partie_droite)

def reinit():
 if str(Partie_gauche) not in Panneaux.panes():
   Panneaux.add(Partie_gauche, width='200px')
 if str(Partie_centrale) not in Panneaux.panes():
   Panneaux.add(Partie_centrale, width='200px')
 if str(Partie_droite) not in Panneaux.panes():
   Panneaux.add(Partie_droite, width='200px')
 Panneaux.paneconfig(Partie_gauche, before=Partie_centrale)
 Panneaux.paneconfig(Partie_droite, after=Partie_centrale)