NAME
Tk::ObjectHandler - Perl extension for Tk
SYNOOPSIS
use Tk::ObjectHandler;
my $tk = Tk::ObjectHandler->new();
$tk->add_widget("Button","but1", -text, "Press Me", -command => sub{ $tk->destroy(); });
$tk->but1->pack(-fill => "both");
$tk->Loop;
ABSTRACT
Tk::ObjectHandler provides an automated method for
creating, ordering and cataloging the variables used to
hold Tk widgets. Rather than having to use a confusing
number of individual holders ObjectHandler arranges the
widgets so that widgets that are packed onto a parent
widget are called via the parent widget.
DESCRIPTION
Creating a program in Tk can sometimes become confusing
due to the number of variables needed to hold pointers to
widgets. Tk::ObjectHandler is an attempt to provide a
generic method for providing a logical heirarchy for
widgets, allowing easy reference through one entrance
point.
When created, the Tk::ObjectHandler object sets up a
Tk::Toplevel widget and wraps it in it's own
administration code. This code allows you to set up a
heirarchy of widgets all accessable through one entry
point. For example, imagine a simple report window, say
with a couple of labels and a close button. In
traditional Tk you would create these like the following:
my $mw = new MainWindow();
my $label1 = $mw->Label(-text => 'Title text');
my $label2 = $mw->Label(-text => 'Body text of the message window');
my $button = $mw->Button(-text => 'Close', -command => sub { $mw->destroy; });
$label1->pack();
$label2->pack();
$button->pack();
Using ObjectHandler, there is only one variable used:
my $mw = Tk::ObjectHandler->new();
$mw->add_widget('Label', 'Label1', -text => 'Title text');
$mw->add_widget('Label', 'Label2', -text => 'Body text of the message window');
$mw->add_widget('Button', 'button', -text => 'Close', -command => sub { $mw->destroy; });
$mw->Label1->pack();
$mw->Label2->pack();
$mw->button->pack();
So, what is the difference? Well, in the example above,
not much really, but in larger programs the number of
variables required can become hard to keep track of
leading to duplication and slowing development time while
you play 'hunt the variable'. ObjectHandler overcoes this
problem in two ways. First, objects are refered to in a
structured format, you can only refer to a widget through
its parent, like below:
$mw->frame->label1->configure(...)
...would configure the widget label1 that is attatched to
the frame that is attatched to the main window.
Using this heirarcal method of naming means that you can
use the following as valid widget names:
$mw->frame1->label1...
$mw->frame2->label1...
$mw->frame3->label1...
$mw->frame4->label1...
...which can save wear and tear on the brain when thinking
of variable names ;)
The second method in which ObjectHandler helps is with
it's self-documenting code. Using the report method you
can automatically generate reports on the widgets and sub
widgets (and sub-sub widgets etc) of the whole program or
any section thereof. As well as names and widget types,
ObjectHandler also allows you to inser comments into the
tree.
CONSTRUCTOR
new([ARGS])
New initiates the ObjectHandler and creates a standard
Tk::Toplevel widget. See Tk::TopLevel for ARGS.
METHODS
$obj->add_widget(type, name[, ARGS])
Add widget creates an object of the type type and adds
it as a sub object of the object $obj with a name
name. In other words:
$obj->add_widget('Frame', 'Frame1');
Creates a frame widget under $obj that can be accessed
by $obj->Frame1:
$obj->Frame1->add_widget('Label', 'L1', -text => 'This is a test');
This would create another widget, a label this time,
under the Frame1 frame and give it the text 'This is a
test'. For a description of ARGS see the perldoc or
manpage for the widget you wish to create.
$obj->comment([text])
If called with an argument this method attatches the
argument to the object. If called without an argument
it returns any existing argument. This comment is
included in the widget report. See report below.
$obj->report()
This method returns a string containing a report of
the current widget and all widgets below it. Included
for each widget is it's name, it's type and any
comment attatched to it with the $obj-comment> method.
This is a documentation tool, allowing for a simple
method to describe the structure of your program. A
sample report is as follows:
Structural layout of snake.pl
MainWindow reportwin - Tk::Toplevel
title - Tk::Label
text - Tk::Label
close - Tk::Button
field - Tk::Canvas
score - Tk::Frame
snake_length - Tk::Label
score - Tk::Label
l1 - Tk::Label
l3 - Tk::Label
message - Tk::Frame
messages - Tk::Label
menu - Tk::Frame This comment could describe
this menubar, telling us about the
buttons.
help - Tk::Menubutton
game - Tk::Menubutton
rep - Tk::Menubutton
$obj->getobj()
This returns the windget in Tk form. This is intended
for use with things like fonts, etc, that are included
as arguments in other widgets.
STANDARD TK COMMANDS
All commands that a widget could normally use can still be
used by a widget created with object handler. Grid, pack,
configure etc are accessed in the normal way,
$mw->widget->configure() for example.
AUTHOR
Simon Parsons
[email protected]
COPYRIGHT
Copyright (C) 2001-2002, Simon Parsons. This module is
distributed under the terms and conditions of the GNU
public licence and the Perl Artistic Licence
SEE ALSO
perl(1), Tk.
TODO
Add variable storage to the object heirarchy.
Copy and Move commands for quick propogation of widgets.