Hi
snotnose,
How about something like this:
use strict;
use Tk;
use Data::Dumper;
+
my $addy1 = '32';
my $addy2 = '42';
+
my $mw = MainWindow->new(-title => 'Mac Address Input Example');
my $fr = $mw->Frame()->pack(-expand => 1, -fill => 'both');
my $lb = $fr->Label(-text => 'MAC Address')->pack(-side => 'left');
+
my $e1 = $fr->Entry();
$e1->configure(
-textvariable => \$addy1,
-width => 2,
-validate => 'focusout',
-validatecommand => \&validate,
-invalidcommand => [ \&show_invalid, $e1 ],
);
$e1->pack(-side => 'left');
+
# Need a field to go to so 'focusout' can happen.
my $e2 = $fr->Entry();
$e2->configure(
-textvariable => \$addy2,
-width => 2,
-validate => 'focusout',
-validatecommand => \&validate,
-invalidcommand => [ \&show_invalid, $e2 ],
);
$e2->pack(-side => 'left');
MainLoop;
+
+
sub validate {
my ($val) = @_;
my $b_valid = ($val =~ /^[0-9a-f]{1,2}$/i)? 1: 0;
+
# debugging, print the field.
printf"<%s>: %s valid\n", $val, $b_valid? "IS": "is NOT";
return $b_valid;
}
+
sub show_invalid {
my ($widget) = @_;
$widget->focus();
my $bg = $widget->cget(-background);
$widget->configure(-background => 'red');
$widget->update();
select(undef, undef, undef, 0.2);
$widget->configure(-background => $bg);
$widget->update();
}
Some observations / comments:
- You may want to create a Frame to pack things into rather than the MainWindow widget; it makes it easier to add to later.
- It's *much* easier to create a subroutine for your callbacks, especially since it leads to code re-use, which is a GOOD THING. That's why I created validate() and show_valid().
- If you assign your Entry widgets to specific variables (in this case $e1 and $e2), you can then pass those variables to the show_invalid() subroutine.
- Assigning a boolean ($b_valid) to the result of the regular expression match is another example of code reuse; now you only have to modify a single regular expression if it needs changing, and still use the result (both in your debugging statement, and the return value of the subroutine). For example, you might decide you want to force the hex byte to always be 2-digits, and then you only need to change {1,2} to {2} in one location.
- The subroutine show_invalid() forces the invalid Entry widget to reclaim focus, gets its background color, changes it to red, updates the widget, pauses for 0.2 seconds, changes it back to its original color, and updates it again (the updates make sure that the red "flash" is visible).
s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.