Un cadre avec des ascenseurs

 

ulis, 2003-06-28: Un package vite fait pour munir un cadre d'ascenseurs, en pur Tcl/Tk.

La page complète avec le code : http://wiki.tcl.tk/9223

Le fichier zip : http://wfr.tcl.tk/fichiers/ulis/Scrolledframe.zip


Voir aussi


Discussion

Kroc - 20 Juillet 2005 :

Voilà une petite astuce pour que le widget qui vient de recevoir le focus dans une ScrolledFrame soit toujours visible.

Première étape : création d'une ScrolledFrame de démonstration avec 60 rangs au total mais configurée pour n'en afficher que 20 :

 proc demo {parent} {
    ::scrolledframe::scrolledframe $parent.sf -yscroll "$parent.sb set"
    ::ttk::scrollbar $parent.sb  -orient vertical  -command "$parent.sf yview" -takefocus 0
    grid configure $parent.sf -row 1 -column 0 -sticky nsew
    grid configure $parent.sb -row 1 -column 1 -sticky ns
    # Nom du widget "scrollable" :
    set scrollable $parent.sf.scrolled
    # Création de 60 entry bidons pour la démo :
    for {set row 0} {$row < 60} {incr row} {
      grid configure [entry ${scrollable}.$row -textvariable ::v$row] -row $row
      set ::v$row "On est au rang [expr $row +1]"
    }

    # Affichage et positionnement :
    update
    grid rowconfigure $parent 1 -weight 1
    grid columnconfigure $parent 0 -weight 1
    set W [expr [winfo width $scrollable]+[winfo width $parent.sb]]
    # On décide de n'afficher que 20 lignes à la fois :
    if {[incr row] > 20} { set row 20 }
    set H [expr [winfo height ${scrollable}.0]*$row]
    wm geometry $parent ${W}x${H}
    # On colle le focus à la première entry :
    ${scrollable}.0 select range 0 end
    focus -force ${scrollable}.0

    # L'astuce est ici :
    bind all <FocusIn> {+ MontreLe %W}
 }

Et voilà la procédure qui se charge d'afficher le bon widget :

 proc MontreLe {widget} {
    if {[string first ".scrolled" $widget]==-1} { return }
    set dernier [lindex [winfo children [winfo parent $widget]] end]
    set pos1 [winfo y $dernier]
    set pos2 [expr [winfo y $widget]-10*[winfo height $widget]]
    if {$pos2<1} { set pos2 1 }
    set val [expr 1.0 * $pos2 / $pos1]
    catch "[winfo parent [winfo parent $widget]] yview moveto $val"
    return
 }

Il ne reste plus qu'à lancer tout ça avec le bout de code suivant :

 package require Tk
 package require Scrolledframe
 demo [toplevel .demo]

... et à vous "balader" d'une entry à la suivante avec la touche tabulation.


Catégorie Exemple | Catégorie Widget | Catégorie Paquet | Catégorie Interface utilisateur