ulis, 2006-01-19. Comparaison des geometry managers (gestionnaires de géométrie) de Tk : grid, pack et place.
Pourquoi
Pour choisir le bon geometry manager en connaissance de cause.
Comment
En comparant trois scripts qui affichent la fenêtre dynamique ci-dessus : un text et ses scrollbars associées.
Grid
# create widgets
text .t
scrollbar .hs -orient horizontal
scrollbar .vs -orient vertical
# show/place widget
grid .t -row 0 -column 0 -sticky nsew
grid .vs -row 0 -column 1 -sticky ns
grid .hs -row 1 -column 0 -sticky ew
# resize widgets in parent
grid rowconfigure . 0 -weight 1
grid columnconfigure . 0 -weight 1
Commentaires
- Le script est simple et bien compréhensible.
- L'option -sticky indique les côtés du widgets qui collent aux bords de la cellule.
- Les opérations rowconfigure -weight et columnconfigure -weight désignent la ligne et la colonne qui grossissent lors d'un redimensionnement du parent.
Qualités
- grid est idéal pour les fenêtres organisée en cellules.
- Il permet d'ajuster finement la façon dont les cellules prennent du poids lorsque le parent est redimensionné.
- Il est relativement insensible aux widgets fils qui disparaissent.
Défauts
- grid nécessite l'utilisation des opérations rowconfigure et columnconfigure pour indiquer comment se redimensionnent les cellules dans le parent.
Pack
# create widgets
frame .f
frame .f.g
text .f.g.t
scrollbar .f.g.vs -orient vertical
frame .f.h
scrollbar .f.h.hs -orient horizontal
canvas .f.h.c -width 0 -height 0 \
-bd 0 -highlightt 0
# show/place widgets
pack .f -fill both -expand 1
pack .f.g -fill both -expand 1 -side top
pack .f.h -fill x -expand 0 -side bottom
pack .f.g.t -fill both -expand 1 -side left
pack .f.g.vs -fill y -expand 0 -side right
pack .f.h.hs -fill x -expand 1 -side left
pack .f.h.c -expand 0 -side right
# size widgets
update
set w2 [winfo width .f.g.vs]
.f.h.c config -width $w2Commentaires
- La première difficulté est de mettre les widgets au bon endroit : il faut séquencer savament les ordres pack et choisir judicieusement la valeur de l'option -side.
- La seconde difficulté est de garder la place entre les deux ascenseurs (en bas à droite). C'est la raison d'être du canvas et de la répartition en frames.
- La troisième difficulté est de faire grossir l'ascenseur horizontal seulement suivant les x alors que le texte grossit dans les deux sens. La difficulté est due aux deux -expand 1 pour des frames de même niveau. Le premier -expand 1 étant nécessaire pour grossir le texte. Le second étant nécessaire pour faire s'élargir l'ascenseur horizontal.
Qualités
- pack permet de définir facilement le seul widget qui prend du poids lors d'un redimensionnement du parent.
Défauts
- pack ne sait pas réserver de place vide dans la distribution des widgets.
- Il ne sait pas réarranger les widgets lorsque le parent maigrit au-delà de sa taille initiale.
- La séquence des ordres pack est importante. Intervertir deux lignes peut aboutir à une organisation différente.
- L'option -expand indique que le widget grossira lorsque le parent grossira. Mais il ne permet pas de limiter à un grossissement horizontal ou vertical.
- L'option -fill précise, elle, le sens du grossissement une fois que la cavité a grossi suite au grossissement d'une autre cavité (ce qui peut arriver même avec -expand 0).
Place
# create widgets
text .t
scrollbar .hs -orient horizontal
scrollbar .vs -orient vertical
# show/place widgets
place .t -x 0 -y 0 -anchor nw
place .vs -relx 1.0 -y 0 -anchor ne
place .hs -x 0 -rely 1.0 -anchor sw
# size parent from widgets
update
set w1 [winfo width .t]
set w2 [winfo width .vs]
set h1 [winfo height .t]
set h2 [winfo height .hs]
set width [expr {$w1 + $w2}]
set height [expr {$h1 + $h2}]
. config -width $width -height $height
# resize widgets in parent
set resizing 0
proc resize {} \
{
if {$::resizing} { return }
set ::resizing 1
set width [winfo width .]
set height [winfo height .]
set w1 [expr {$width - $::w2}]
set h1 [expr {$height - $::h2}]
place .t -width $w1 -height $h1
place .vs -height $h1
place .hs -width $w1
set ::resizing 0
}
bind . <Configure> resizeCommentaires
- La partie placement du script est claire. La partie redimensionnement est complexe.
- Il faut redimensionner à la main le parent en fonction des widgets contenus.
- Il faut redimensionner à la main les widgets lorsque le parent s'agrandit. Pour cela, place a les options -widthet -height.
Qualités
- place permet de positionner un widget en x y très facilement. Et même à l'extérieur du parent.
Défauts
- place ne gère pas le redimensionnement des widgets dans le parent ou le redimensionnement du parent par remplissage.
Voir aussi
Discussion
Catégorie Interface utilisateur | Catégorie Exemple