Typically, Buttons are meant to be pressed. But sometimes you display a Button that you want to be disabled. For example, you may not want users to submit a form unless they’ve filled out some required fields.
To disable a
Button, use the -state
option.
-state => "normal
" | "disabled" | "active"
The
"normal"
state is what we’ve been describing
throughout this chapter so far: the Button changes colors when the
mouse passes over it and performs the assigned callback (or changes
indicator status) when clicked. The "active"
state
is when the mouse cursor is physically over the Button and is used
internally by Perl/Tk. The "disabled"
state is
when the Button appears grayed out (or with whatever colors have been
specified by -disabledforeground
and
-disabledbackground
) and will not respond to the
mouse at all.
For example, suppose we have a Button that disables another when it is pressed. The code would look like this:
my $exit_b = $mw->Button(-text => 'Exit', -command => sub { exit })->pack; $var = "Disable Exit"; $mw->Button(-textvariable => \$var, -command => sub { my $state = $exit_b->cget(-state); if ($state eq "disabled") { $exit_b->configure(-state => 'normal'); $var = "Disable Exit"; } else { $exit_b->configure(-state => 'disabled'); $var = "Enable Exit"; }})->pack;
In this example, a reference to the Exit Button is saved because it
needs to be used later to change the state of the Button. Also, note
that $exit_b
is used inside the scope of the
anonymous subroutine. This will work only if
$exit_b
is left in the global scope of the entire
program, so $exit_b
will be defined when the
anonymous subroutine is executed. Be careful not to set
$exit_b
to something else; if you do, the
anonymous subroutine will refer to the new value in
$exit_b
when it is invoked, not the value you
wanted.
Figure 4-15 shows the window after we have clicked the Disable Exit Button once.
A Button should not be available for selecting unless it makes sense in the application. By disabling widgets when they can’t do anything, you give users visual hints about what they can and cannot do in the application.
Sometimes the terminology becomes confusing when talking about state and status. With Checkbuttons and Radiobuttons, there is the indicator’s status (or value) and the state of the Button itself. The status of the button is either on or off, depending on whether it is checked. The state of the entire Checkbutton (including the indicator) can be normal, active, or disabled.
Get Mastering Perl/Tk now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.