To create a widget and Scrollbars at the same time, use the Scrolled method. Scrolled returns a pointer to the widget created. It is the easiest way to add Scrollbars to a scrollable widget. The Scrolled method creates a Frame that contains the widget and Scrollbar(s). You create them all in one command.
The usage for the Scrolled method is:
$widget = $parent->Scrolled('Widget', -scrollbars => 'string' [, options ]);
The first argument is the widget to create, such as "Listbox" or "Canvas". The other argument you'll need to use is the -scrollbars option, which takes a string that tells it which Scrollbars to create and where to put them.
The possible values for -scrollbars are "n", "s", "e", "w"; or "on", "os", "oe", "ow"; or some combination of those that combines n or s with an e or w. The "n" means to put a horizontal Scrollbar above the widget. An "s" means to put a horizontal Scrollbar below the widget. The "e" means to put a vertical Scrollbar to the right of the widget. The "w" means to put a vertical Scrollbar to the left of the widget.
You can have a maximum of two Scrollbars for each widget. For instance, we can create one Scrollbar on the "n" side of the widget. It is possible to use "nw" to create two Scrollbars, one on the top and one on the left of the widget. It is not legal to use "ns", because "n" and "s" scroll in the same direction.
The "o" in front of the direction makes that Scrollbar optional. Optional Scrollbars will only display when the size of the widget makes it necessary to scroll the information in the widget. Always list the north or south value first (if you use either) to avoid complaints from the subroutine. Here are some examples to make this clearer:
# Create optional Scrollbar east (to the right) of widget $lb = $mw->Scrolled("Listbox", -scrollbars => 'oe')->pack; # Create Scrollbars to south (below) and east (to the right) of widget $lb = $mw->Scrolled("Listbox", -scrollbars => 'se')->pack; # Create optional Scrollbars south (below) and east (right) of widget $lb = $mw->Scrolled("Listbox", -scrollbars => 'osoe')->pack; # Create Scrollbars to the north (above) and west (to the left) of widget $lb = $mw->Scrolled("Listbox", -scrollbars => 'nw')->pack;
Any other options sent with the Scrolled method will configure only the widget created. If you need to configure the Scrollbars, use the Subwidget method from the widget reference. The Subwidget method can be used because a Scrolled widget is really a composite widget. Composite widgets are covered in Chapter 14, "Creating Custom Widgets in Pure Perl/Tk".
To turn the background of your horizontal Scrollbar green, use this code:
$lb->Subwidget("xscrollbar")->configure(-background => "green");
To configure a vertical Scrollbar, use "yscrollbar" in place of "xscrollbar". If you try to configure a Scrollbar that you didn't create (e.g., you used -scrollbars => "e" and tried to configure the "xscrollbar"), an error occurs.
To configure just the widget, you can use $widget->configure after calling Scrolled, or you can use:
$widget->Subwidget("widget")->configure(...);
Using Subwidget this way is silly because you can just use $widget. The "widget" string is the same as the first argument sent to Scrolled except it's all lowercase. For instance, in the preceding example we called Scrolled with "Listbox", but we would use "listbox" with the Subwidget method.
Even better, Tk provides a subwidget named "scrolled", which is always the scrolled widget, whatever kind it might be.