listbox(3)

NAME

Tk::Listbox - Create and manipulate Listbox widgets

SYNOPSIS

$listbox = $parent->Listbox(?options?);

STANDARD OPTIONS

-background -foreground -relief -takefocus -bor derwidth -height -selectbackground -width -cur sor -highlightbackground -selectborder width -xscrollcommand -exportselection -highlight color -selectforeground -yscrollcommand -font -highlightthickness -setgrid

See Tk::options for details of the standard options.

WIDGET-SPECIFIC OPTIONS

Name: height
Class: Height
Switch: -height
Specifies the desired height for the window, in lines.
If zero or less, then the desired height for the win
dow is made just large enough to hold all the elements
in the listbox.
Name: selectMode
Class: SelectMode
Switch: -selectmode
Specifies one of several styles for manipulating the
selection. The value of the option may be arbitrary,
but the default bindings expect it to be either sin
gle, browse, multiple, or extended; the default value is browse.
Name: width
Class: Width
Switch: -width
Specifies the desired width for the window in charac
ters. If the font doesn't have a uniform width then
the width of the character ``0'' is used in translat
ing from character units to screen units. If zero or
less, then the desired width for the window is made
just large enough to hold all the elements in the
listbox.

DESCRIPTION

The Listbox method creates a new window (given by the
$widget argument) and makes it into a listbox widget.
Additional options, described above, may be specified on
the command line or in the option database to configure
aspects of the listbox such as its colors, font, text, and
relief. The listbox command returns its $widget argument. At the time this command is invoked, there must not exist
a window named $widget, but $widget's parent must exist.

A listbox is a widget that displays a list of strings, one
per line. When first created, a new listbox has no ele
ments. Elements may be added or deleted using methods
described below. In addition, one or more elements may be
selected as described below. If a listbox is exporting
its selection (see exportSelection option), then it will observe the standard X11 protocols for handling the
selection. Listbox selections are available as type
STRING; the value of the selection will be the text of the selected elements, with newlines separating the elements.

It is not necessary for all the elements to be displayed
in the listbox window at once; commands described below
may be used to change the view in the window. Listboxes
allow scrolling in both directions using the standard
xScrollCommand and yScrollCommand options. They also sup port scanning, as described below.

INDICES

Many of the methods for listboxes take one or more indices
as arguments. An index specifies a particular element of
the listbox, in any of the following ways:

number
Specifies the element as a numerical index, where 0
corresponds to the first element in the listbox.
active
Indicates the element that has the location cursor.
This element will be displayed with an underline when
the listbox has the keyboard focus, and it is speci
fied with the activate method.
anchor
Indicates the anchor point for the selection, which is
set with the selection anchor method.
end Indicates the end of the listbox. For most commands
this refers to the last element in the listbox, but
for a few commands such as index and insert it refers to the element just after the last one.
@x,y
Indicates the element that covers the point in the
listbox window specified by x and y (in pixel coordi
nates). If no element covers that point, then the
closest element to that point is used.
In the method descriptions below, arguments named index,
first, and last always contain text indices in one of the above forms.

WIDGET METHODS

The Listbox method creates a widget object. This object supports the configure and cget methods described in Tk::options which can be used to enquire and modify the
options described above. The widget also inherits all the
methods provided by the generic Tk::Widget class.

The following additional methods are available for listbox
widgets:

$listbox->activate(index)
Sets the active element to the one indicated by index.
If index is outside the range of elements in the list
box then the closest element is activated. The active
element is drawn with an underline when the widget has
the input focus, and its index may be retrieved with
the index active.
$listbox->bbox(index)
Returns a list of four numbers describing the bounding
box of the text in the element given by index. The
first two elements of the list give the x and y coor
dinates of the upper-left corner of the screen area
covered by the text (specified in pixels relative to
the widget) and the last two elements give the width
and height of the area, in pixels. If no part of the
element given by index is visible on the screen, or if
index refers to a non-existent element, then the
result is an empty string; if the element is par
tially visible, the result gives the full area of the
element, including any parts that are not visible.
$listbox->curselection
Returns a list containing the numerical indices of all
of the elements in the listbox that are currently
selected. If there are no elements selected in the
listbox then an empty string is returned.
$listbox->delete(first, ?last?)
Deletes one or more elements of the listbox. First
and last are indices specifying the first and last
elements in the range to delete. If last isn't speci
fied it defaults to first, i.e. a single element is
deleted.
$listbox->get(first, ?last?)
If last is omitted, returns the contents of the list
box element indicated by first, or an empty string if
first refers to a non-existent element. If last is specified, the command returns a list whose elements
are all of the listbox elements between first and
last, inclusive. Both first and last may have any of the standard forms for indices.
$listbox->index(index)
Returns the integer index value that corresponds to
index. If index is end the return value is a count of the number of elements in the listbox (not the index
of the last element).
$listbox->insert(index, ?element, element, ...?)
Inserts zero or more new elements in the list just
before the element given by index. If index is speci fied as end then the new elements are added to the end
of the list. Returns an empty string.
$listbox->nearest(y)
Given a y-coordinate within the listbox window, this
command returns the index of the (visible) listbox
element nearest to that y-coordinate.
$listbox->scan(option, args)
This command is used to implement scanning on list
boxes. It has two forms, depending on option:
$listbox->scanMark(x, y)
Records x and y and the current view in the
listbox window; used in conjunction with
later scan dragto commands. Typically this command is associated with a mouse button
press in the widget. It returns an empty
string.
$listbox->scanDragto(x, y.)
This command computes the difference between
its x and y arguments and the x and y argu
ments to the last scan mark command for the widget. It then adjusts the view by 10 times
the difference in coordinates. This command
is typically associated with mouse motion
events in the widget, to produce the effect of
dragging the list at high speed through the
window. The return value is an empty string.
$listbox->see(index)
Adjust the view in the listbox so that the element
given by index is visible. If the element is already
visible then the command has no effect; if the element
is near one edge of the window then the listbox
scrolls to bring the element into view at the edge;
otherwise the listbox scrolls to center the element.
$listbox->selection(option, arg)
This command is used to adjust the selection within a
listbox. It has several forms, depending on option:
$listbox->selectionAnchor(index)
Sets the selection anchor to the element given
by index. If index refers to a non-existent element, then the closest element is used.
The selection anchor is the end of the selec
tion that is fixed while dragging out a selec
tion with the mouse. The index anchor may be
used to refer to the anchor element.
$listbox->selectionClear(first, ?last?)
If any of the elements between first and last (inclusive) are selected, they are deselected.
The selection state is not changed for ele
ments outside this range.
$listbox->selectionIncludes(index)
Returns 1 if the element indicated by index is
currently selected, 0 if it isn't.
$listbox->selectionSet(first, ?last?)
Selects all of the elements in the range
between first and last, inclusive, without affecting the selection state of elements out
side that range.
$listbox->size
Returns a decimal string indicating the total number
of elements in the listbox.
$listbox->xview(args)
This command is used to query and change the horizon
tal position of the information in the widget's win
dow. It can take any of the following forms:
$listbox->xview
Returns a list containing two elements. Each
element is a real fraction between 0 and 1;
together they describe the horizontal span
that is visible in the window. For example,
if the first element is .2 and the second ele
ment is .6, 20% of the listbox's text is offscreen to the left, the middle 40% is visible
in the window, and 40% of the text is offscreen to the right. These are the same val
ues passed to scrollbars via the -xscrollcom mand option.
$listbox->xview(index)
Adjusts the view in the window so that the
character position given by index is displayed
at the left edge of the window. Character
positions are defined by the width of the
character 0.
$listbox->xview(moveto => fraction)
Adjusts the view in the window so that frac_
tion of the total width of the listbox text is
off-screen to the left. fraction must be a fraction between 0 and 1.
$listbox->xview(scroll => number, what)
This command shifts the view in the window
left or right according to number and what. Number must be an integer. What must be either units or pages or an abbreviation of one of these. If what is units, the view adjusts left or right by number character
units (the width of the 0 character) on the
display; if it is pages then the view adjusts
by number screenfuls. If number is negative then characters farther to the left become
visible; if it is positive then characters
farther to the right become visible.
$listbox->yview(?args?)
This command is used to query and change the vertical
position of the text in the widget's window. It can
take any of the following forms:
$listbox->yview
Returns a list containing two elements, both
of which are real fractions between 0 and 1.
The first element gives the position of the
listbox element at the top of the window, rel
ative to the listbox as a whole (0.5 means it
is halfway through the listbox, for example).
The second element gives the position of the
listbox element just after the last one in the
window, relative to the listbox as a whole.
These are the same values passed to scrollbars
via the -yscrollcommand option.
$listbox->yview(index)
Adjusts the view in the window so that the
element given by index is displayed at the top
of the window.
$listbox->yview(moveto => fraction)
Adjusts the view in the window so that the
element given by fraction appears at the top of the window. Fraction is a fraction between 0 and 1; 0 indicates the first element in the
listbox, 0.33 indicates the element one-third
the way through the listbox, and so on.
$listbox->yview(scroll => number, what)
This command adjusts the view in the window up
or down according to number and what. Number must be an integer. What must be either units or pages. If what is units, the view adjusts up or down by number lines; if it is pages then the view adjusts by number screenfuls.
If number is negative then earlier elements
become visible; if it is positive then later
elements become visible.

DEFAULT BINDINGS

Tk automatically creates class bindings for listboxes that
give them Motif-like behavior. Much of the behavior of a
listbox is determined by its selectMode option, which selects one of four ways of dealing with the selection.

If the selection mode is single or browse, at most one element can be selected in the listbox at once. In both
modes, clicking button 1 on an element selects it and des
elects any other selected item. In browse mode it is also possible to drag the selection with button 1.

If the selection mode is multiple or extended, any number of elements may be selected at once, including discontigu
ous ranges. In multiple mode, clicking button 1 on an element toggles its selection state without affecting any
other elements. In extended mode, pressing button 1 on an element selects it, deselects everything else, and sets
the anchor to the element under the mouse; dragging the
mouse with button 1 down extends the selection to include
all the elements between the anchor and the element under
the mouse, inclusive.

Most people will probably want to use browse mode for sin
gle selections and extended mode for multiple selections;
the other modes appear to be useful only in special situa
tions.

In addition to the above behavior, the following addi
tional behavior is defined by the default bindings:

[1] In extended mode, the selected range can be adjusted
by pressing button 1 with the Shift key down: this
modifies the selection to consist of the elements
between the anchor and the element under the mouse,
inclusive. The un-anchored end of this new selection
can also be dragged with the button down.
[2] In extended mode, pressing button 1 with the Control
key down starts a toggle operation: the anchor is set
to the element under the mouse, and its selection
state is reversed. The selection state of other ele
ments isn't changed. If the mouse is dragged with
button 1 down, then the selection state of all ele
ments between the anchor and the element under the
mouse is set to match that of the anchor element; the
selection state of all other elements remains what it
was before the toggle operation began.
[3] If the mouse leaves the listbox window with button 1
down, the window scrolls away from the mouse, making
information visible that used to be off-screen on the
side of the mouse. The scrolling continues until the
mouse re-enters the window, the button is released, or
the end of the listbox is reached.
[4] Mouse button 2 may be used for scanning. If it is
pressed and dragged over the listbox, the contents of
the listbox drag at high speed in the direction the
mouse moves.
[5] If the Up or Down key is pressed, the location cursor
(active element) moves up or down one element. If the
selection mode is browse or extended then the new active element is also selected and all other elements
are deselected. In extended mode the new active ele ment becomes the selection anchor.
[6] In extended mode, Shift-Up and Shift-Down move the
location cursor (active element) up or down one ele
ment and also extend the selection to that element in
a fashion similar to dragging with mouse button 1.
[7] The Left and Right keys scroll the listbox view left
and right by the width of the character 0. ControlLeft and Control-Right scroll the listbox view left
and right by the width of the window. Control-Prior
and Control-Next also scroll left and right by the
width of the window.
[8] The Prior and Next keys scroll the listbox view up and
down by one page (the height of the window).
[9] The Home and End keys scroll the listbox horizontally
to the left and right edges, respectively.
[10]
Control-Home sets the location cursor to the the first
element in the listbox, selects that element, and des
elects everything else in the listbox.
[11]
Control-End sets the location cursor to the the last
element in the listbox, selects that element, and des
elects everything else in the listbox.
[12]
In extended mode, Control-Shift-Home extends the
selection to the first element in the listbox and Con
trol-Shift-End extends the selection to the last ele
ment.
[13]
In multiple mode, Control-Shift-Home moves the loca tion cursor to the first element in the listbox and
Control-Shift-End moves the location cursor to the
last element.
[14]
The space and Select keys make a selection at the
location cursor (active element) just as if mouse but
ton 1 had been pressed over this element.
[15]
In extended mode, Control-Shift-space and Shift-Select extend the selection to the active element just as if
button 1 had been pressed with the Shift key down.
[16]
In extended mode, the Escape key cancels the most
recent selection and restores all the elements in the
selected range to their previous selection state.
[17]
Control-slash selects everything in the widget, except
in single and browse modes, in which case it selects the active element and deselects everything else.
[18]
Control-backslash deselects everything in the widget,
except in browse mode where it has no effect.
[19]
The F16 key (labelled Copy on many Sun workstations)
or Meta-w copies the selection in the widget to the
clipboard, if there is a selection.
The behavior of listboxes can be changed by defining
new bindings for individual widgets or by redefining
the class bindings.

TIED INTERFACE

The Tk::Listbox widget can also be tied to a scalar or
array variable, with different behaviour depending on the
variable type, with the following tie commands:
use Tk;
my ( @array, $scalar, $other );
my %options = ( ReturnType => "index" );
my $MW = MainWindow->new();
my $lbox = $MW->Listbox()->pack();
my @list = ( "a", "b", "c", "d", "e", "f" );
$lbox->insert('end', @list );
tie @array, "Tk::Listbox", $lbox
tie $scalar, "Tk::Listbox", $lbox;
tie $other, "Tk::Listbox", $lbox, %options;
currently only one modifier is implemented, a 3 way flag
for tied scalars "ReturnType" which can have values "ele
ment", "index" or "both". The default is "element".
Tied Arrays
If you tie an array to the Listbox you can manipulate
the items currently contained by the box in the same
manner as a normal array, e.g.

print @array;
push(@array, @list);
my $popped = pop(@array);
my $shifted = shift(@array);
unshift(@array, @list);
delete $array[$index];
print $string if exists $array[$i];
@array = ();
splice @array, $offset, $length, @list
The delete function is implemented slightly differ
ently from the standard array implementation. Instead
of setting the element at that index to undef it
instead physically removes it from the Listbox. This
has the effect of changing the array indices, so for
instance if you had a list on non-continuous indices
you wish to remove from the Listbox you should reverse
sort the list and then apply the delete function, e.g.

my @list = ( 1, 2, 4, 12, 20 );
my @remove = reverse sort { $a <=> $b } @list;
delete @array[@remove];
would safely remove indices 20, 12, 4, 2 and 1 from
the Listbox without problems. It should also be noted
that a similar warning applies to the splice function
(which would normally be used in this context to per
form the same job).
Tied Scalars
Unlike tied arrays, if you tie a scalar to the Listbox
you can retrieve the currently selected elements in
the box as an array referenced by the scalar, for
instance

my @list = ( "a", "b", "c", "d", "e", "f" );
$lbox->insert('end', sort @list );
$lbox->selectionSet(1);
inserts @list as elements in an already existing list
box and selects the element at index 1, which is "b".
If we then

print @$selected;
this will return the currently selected elements, in
this case "b".
However, if the "ReturnType" arguement is passed when
tying the Listbox to the scalar with value "index"
then the indices of the selected elements will be
returned instead of the elements themselves, ie in
this case "1". This can be useful when manipulating
both contents and selected elements in the Listbox at
the same time.
Importantly, if a value "both" is given the scalar
will not be tied to an array, but instead to a hash,
with keys being the indices and values being the ele
ments at those indices
You can also manipulate the selected items using the
scalar. Equating the scalar to an array reference will
select any elements that match elements in the List
box, non-matching array items are ignored, e.g.

my @list = ( "a", "b", "c", "d", "e", "f" );
$lbox->insert('end', sort @list );
$lbox->selectionSet(1);
would insert the array @list into an already existing
Listbox and select element at index 1, i.e. "b"

@array = ( "a", "b", "f" );
$selected = @array;
would select elements "a", "b" and "f" in the Listbox.
Again, if the "index" we indicate we want to use
indices in the options hash then the indices are use
instead of elements, e.g.

@array = ( 0, 1, 5 );
$selected = @array;
would have the same effect, selecting elements "a",
"b" and "f" if the $selected variable was tied with
%options = ( ReturnType => "index" ).
If we are returning "both", i.e. the tied scalar
points to a hash, both key and value must match, e.g.

%hash = ( 0 => "a", 1 => "b", 5 => "f" );
$selected = hash;
would have the same effect as the previous examples.
It should be noted that, despite being a reference to
an array (or possibly a has), you still can not copy
the tied variable without it being untied, instead you
must pass a reference to the tied scalar between sub
routines.

KEYWORDS

listbox, widget, tied
Copyright © 2010-2025 Platon Technologies, s.r.o.           Index | Man stránky | tLDP | Dokumenty | Utilitky | O projekte
Design by styleshout