Tk par l'exemple - le megawidget panes

 

ulis, 2006-11-12.

Exercices : copiez-collez les exemples, exécutez-les puis modifiez-les. Durée : 60 mn.


Objectif

Il existe deux parfums.


Conception

Les boutons de sélection sont côte à côte, au-dessus du panneau visible. Tous les panneaux sont les uns sur les autres, le panneau courant étant visible sur le dessus.

Les difficultés sont de donner une impression de continuité entre le bouton et le panneau correspondant et de garder la même taille quelque soit le contenu du panneau affiché.

C'est le geometry manager place qui placera le panneau flottant et le geometry manager grid qui placera les autres.


Les panneaux fixes

  # toplevel .
  . config -padx 5 -pady 5
  grid rowconfig . 0 -weight 1
  grid columnconf . 0 -weight 1
  # frame .f
  frame .f
  grid .f -sticky nsew
  grid rowconfig .f 1 -weight 1
  grid columnconf .f 999 -weight 1
  # canvas .f.c
  canvas .f.c -width 150 -height 150 -highlightt 0 \
    -bd 1 -relief ridge
  grid .f.c -row 1 -column 0 -columnspan 1000 -sticky nsew
  # boutons
  button .f.b1 -text "pane 1" -command {raise .f.p1}
  button .f.b2 -text "pane 2" -command {raise .f.p2}
  grid .f.b1 .f.b2 -row 0
  # panneaux
  frame .f.p1 -bg azure
  frame .f.p2 -bg beige
  grid .f.p1 -row 1 -column 0 -columnspan 1000 \
    -sticky nsew -padx 1 -pady 1
  grid .f.p2 -row 1 -column 0 -columnspan 1000 \
    -sticky nsew -padx 1 -pady 1
  # titres
  label .f.p1.l -text "pane 1" -bg azure
  label .f.p2.l -text "pane 2" -bg beige
  grid .f.p1.l
  grid .f.p2.l

La composition

Le widget frame .f contient deux rangées :

  1. les boutons,
  2. les panneaux et le widget canvas sous jacent.

Les boutons sont dans des colonnes successives de la première rangée, tassés à gauche.

Les panneaux et le widget canvas sont dans la première colonne de la JL