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