http://www.perlmonks.org?node_id=11147661


in reply to Re: Perl Tk Button Disabled
in thread Perl Tk Button Disabled

I think we are getting close. Below is the sensor code that sends data to the Perl script. The perl script changes the state and color of the button. However my other button code still changes the color of the button whether the sensor is tripped or not.

if ($data =~ /(?<![\w-])ON(?![\w-])/i) { $btn1->configure(-background => "gray", -foreground => "black"); $btn1->configure(-state => "disabled"); print "ON\n"; } if ($data =~ /(?<![\w-])OFF(?![\w-])/i) { $btn1->configure(-background => "green", -foreground => "black"); $btn1->configure(-state => "normal"); print "OFF\n"; }

And this code below still changes the color of $btn1 whether it is disabled or not. It's fine to change the color when it's enabled. It's NOT fine to change the color when it's disabled.

sub chg_btn { $btn1->configure(-background => "green", -foreground => "black"); }

Replies are listed 'Best First'.
Re^3: Perl Tk Button Disabled
by GrandFather (Saint) on Oct 25, 2022 at 00:36 UTC

    So you should now have all almost the pieces you need to work out how to manage not changing button color in chg_btn when it ought not be changed. The missing part is passing the current sensor state into chg_btn in some fashion. Where you set up button call backs you can:

    my %context; ... $button->bind('<ButtonRelease-1>' => sub{chg_btn(\%context, @_});

    and something similar wherever you set up the sensor handling callback/sub. You can then

    sub sensorHandler { my ($context, ...) @_; $context->{sensorOn} = $data !~ /(?<![\w-])OFF(?![\w-])/i; ... }

    and in your button handler you can

    sub chg_btn { my ($context, ...) = @_; $btn1->configure(-background => "green", -foreground => "black") if !$context->{sensorOn}; }
    Optimising for fewest key strokes only makes sense transmitting to Pluto or beyond