Tk

« Tk: alcuni widget: comando entryAppunti di Tcl/TkTk: alcuni widget: comando »

comando listbox

Questo tipo di widget visualizza una lista di stringhe, una per linea e permette di selezionare uno o più elementi dalla lista. Le listbox supportano lo scrolling sia in orizzontale che in verticale tramite le opzioni standard -xscrollcommand e -yscrollcommand.

Ogni elemento della lista è individuato da un indice testuale. I vari tipi di indice sono:

number
indica l'elemento in base al suo numero d'ordine, a partire da 0 che corrisponde al primo elemento della lista
active
indica l'elemento su cui si trova il cursore di locazione, che per default è visualizzato nello stile sottolineato quando la listbox ha il focus
anchor
indica il punto di ancoraggio della selezione (l'estremità di una selezione che rimane fissa quando si trascina per definire una selezione col mouse)
end
indica la fine della lista; per la maggior parte dei comandi end significa l'ultimo elemento, ma per alcuni comandi come index e insert, end si riferisce all'elemento (non ancora esistente) che si trova subito dopo l'ultimo elemento
@x,y
indica l'elemento che comprende il punto di coordinate x,y relative al widget listbox. Se nessun elemento copre quel punto, verrà selezionato l'elemento più vicino

Alcuni comandi di widget più importanti:

pathName insert index ?element element ...?
Inserisce zero o più nuovi elementi nella lista nella posizione precedente a quella dell'elemento di indice index. Se index assume il valore end, allora i nuovi elementi vengono inseriti alla fine della lista. Ritorna la stringa vuota.
pathName delete first ?last?
Elimina uno o più elementi dalla lista. first e last sono indici che indicano il primo e l'ultimo elemento dell'intervallo di elementi da eliminare. Se last non viene specificato viene assunto coincidente con first, ossia verrà eliminato un solo elemento.
pathName index index
Ritorna il valore intero dell'indice che corrisponde all'indice index. Se index è l'indice testuale end, il valore ritornato è il numero di elementi nella listbox (non l'indice dell'ultimo elemento). Un modo più semplice per ricavare il numero di elementi è usare il comando pathName size.
pathName curselection
Ritorna una lista che contiene gli indici numerici di tutti gli elementi della listbox che sono attualmente selezionati. Qualora non vi sia nessun elemento selezionato, ritorna la stringa vuota.
pathName get first ?last?
Se viene omesso last, ritorna il contenuto dell'elemento della listbox di indice first, oppure una stringa vuota se first si riferisce ad un elemento che non esiste. Se viene specificato anche last, il comando ritorna la lista di tutti gli elementi della listbox con indici compresi tra first e last, estremi inclusi. Sia first sia last possono assumere una qualsiasi delle forme viste prima per gli indici.
pathName see index
Aggiusta la vista nella listbox in modo che l'elemento indicato dall'indice index sia visibile. Se l'elemento è già visibile non ha alcun effetto.

Alcune opzioni specifiche di questo widget:

-width
Specifica la larghezza del widget in caratteri. Se si usa un font proporzionale, la larghezza in unità di schermo verrà calcolata moltiplicando la larghezza del carattere "0" per il valore di questa opzione. Per default vale 20.
-height
Indica l'altezza desiderata per il widget. Se è zero o minore di zero, l'altezza sarà giusto quella necessaria per contenere tutti gli elementi della listbox. Per default vale 10.
-listvariable
Specifica il nome di una variabile. Il valore della variabile deve essere una lista che verrà visualizzata all'interno del widget; se il valore della variabile cambia, il widget si aggiornerà automaticamente con il nuovo contenuto. Se si tenta di assegnare alla variabile un valore non valido come lista, si ottiene un errore e l'assegnamento non va a buon fine. Se si tenta di rimuovere una variabile usata da una listbox tramite questa opzione, usando unset(n), questo fallisce silenziosamente, ovvero la variabile non verrà rimossa e non verrà generato alcun errore.
-selectmode
Indica in che modo debba essere manipolata la selezione. Assume i valori single, browse, multiple o extended e il valore di default è browse, adatto per la selezione di un singolo elemento.

Nelle modalità single o browse può essere selezionato al più un elemento della lista (oppure nessuno). Facendo click su un elemento col tasto 1 del mouse (il sinistro), lo seleziona e causa la deselezione di un eventuale altro elemento che era stato selezionato prima.

L'unica differenza tra single e browse è che il modo browse supporta anche il trascimento della selezione (che si effettua tenendo premuto il tasto 1 mentre si va su e giù con il mouse). Nel modo single invece tenendo premuto il tasto 1 e spostando il mouse avanti e indietro si effettua lo scorrimento ma la selezione rimane fissa.

Per permettere la selezione di più di un elemento (persino di intervalli discontinui di elementi), usate invece il modo multiple oppure extended.

Nel modo extended (il più comunemente usato per le selezioni multiple) quando si clicca con il tasto 1 su un elemento lo si seleziona e nel contempo si deselezionano tutti gli altri elementi; inoltre l'ancora della selezione viene impostata a partire dall'elemento selezionato: trascinando poi il mouse, tenendo ancora premuto il tasto 1, estende la selezione in modo da includere tutti gli altri elementi che si trovano tra l'ancora della selezione e l'elemento corrente sotto il mouse, estremi inclusi.

Nel modo multiple invece, cliccando con il tasto 1 su un elemento si inverte il suo stato di selezione, senza cambiare lo stato di selezione degli altri elementi.

Ogni volta che la selezione cambia viene innescato l'evento virtuale <<ListboxSelect>>. Usando il comando bind(n) si può intraprendere una qualsiasi azione di risposta ad un cambiamento di selezione del widget.

Un esempio:

label .msg -wraplength 3i -font {Helvetica 12} \
  -text {Select your favourite programming \
         languages from the list below:}
pack .msg -side top

set f [frame .box -borderwidth .5c]
pack $f -side top -expand 1 -fill y
listbox $f.list -yscroll "$f.vscroll set" \
  -width 12 -height 8 -selectmode extended
scrollbar $f.vscroll -command "$f.list yview"
pack $f.list -side left -expand 1 -fill both
pack $f.vscroll -side right -fill y

set f [frame .but]
pack $f -side bottom -fill x -pady 2m
button $f.ok -text OK -default active -command {
  curselection .box.list
  destroy .
}
button $f.cancel -text Cancel -command {destroy .}
pack $f.ok $f.cancel -side left -expand 1

bind . <Return> {.but.ok invoke}
bind . <Escape> {.but.cancel invoke}

.box.list insert 0 Assembler Basic C C++ Eiffel \
  Forth Fortran Haskell Java Lisp Logo {Objective C} \
  Pascal Perl Php Prolog Python Ruby Scheme Tcl other/s

proc curselection {w} {
  set cursel [$w curselection]
  if {$cursel!=""} {
    foreach element $cursel {
      append msg [$w get $element]\n
    }
    tk_messageBox -title languages -message $msg
  }
}

« Tk: alcuni widget: comando entryAppunti di Tcl/TkTk: alcuni widget: comando »