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

PilotinControl has asked for the wisdom of the Perl Monks concerning the following question:

Good Evening Esteemed Monks! I have a question and code posted below. I am trying to change the color of a button on its release. Any help would be appreciated. Thanks.

#!/usr/bin/perl use warnings; use strict; use Tk; my $mw = new MainWindow; my $label = $mw -> Label(-text=>"Hello World") -> pack(); my $button = $mw -> Button(-activebackground => 'red', -activeforegrou +nd => 'black', -text => "Quit"); $button->bind('<ButtonPress-1>' => \&myexit); $button->bind('<ButtonRelease-1>' => \&myexit2); $button->pack; $button->eventGenerate('<ButtonPress-1>'); $button->eventGenerate('<ButtonRelease-1>'); $mw->after(5000 => \&doit); $mw->after(10000 => \&doit2); sub doit { $button->focus; $button->eventGenerate('<ButtonPress-1>'); } sub doit2 { $button->focus; $button->eventGenerate('<ButtonRelease-1>'); } MainLoop; sub myexit { print time."\n"; } sub myexit2 { $button->configure(-background => "gray", -foreground => "black"); print time."\n"; }

Replies are listed 'Best First'.
Re: Change Color on Button Release
by kcott (Archbishop) on Sep 20, 2022 at 07:07 UTC

    G'day PilotinControl,

    I don't know if there's some confusion between a mouse button and a Button widget; however, what you appear to be asking for is already the default behaviour.

    The change in the default colours is only different shades of grey and perhaps not all that obvious. Run the following code to see what's happening more clearly.

    #!/usr/bin/env perl use strict; use warnings; use Tk; my $mw = MainWindow::->new(); my %colours = qw{ -background red -foreground yellow -activebackground yellow -activeforeground red }; my $button = $mw->Button(-text => 'Test', %colours)->pack(); MainLoop;

    Having done that, if what you're seeing is not what you want, please describe what different behaviour you're looking for.

    — Ken

      Ken...The code worked as described, however, the button in my code once released does not go back to its original color. In using the configure option to change the color does not work either. I must add that this is a Virtual Event. So I'm at a loss at the moment. Thanks for the help.

      #!/usr/bin/perl use warnings; use strict; use Tk; my $mw = new MainWindow; my %colours = qw{ -background grey -foreground black -activebackground red -activeforeground black }; my $label = $mw -> Label(-text=>"Hello World") -> pack(); my $button = $mw -> Button(-text => "Quit", %colours); $button->bind('<ButtonPress-1>' => \&myexit); $button->bind('<ButtonRelease-1>' => \&myexit2); $button->pack; $button->eventGenerate('<ButtonPress-1>'); $button->eventGenerate('<ButtonRelease-1>'); #$mw->repeat(10000 => \&doit); $mw->after(5000 => \&doit); $mw->after(10000 => \&doit2); sub doit { $button->focus; $button->eventGenerate('<ButtonPress-1>'); } sub doit2 { $button->focus; $button->eventGenerate('<ButtonRelease-1>'); } MainLoop; sub myexit { print time."\n"; } sub myexit2 { print time."\n"; }

Re: Change Color on Button Release
by tybalt89 (Monsignor) on Sep 20, 2022 at 18:16 UTC

    While this appears to work, I'm not sure it's the "right" way.
    In fact, I'm tempted to say that having your program press buttons by itself is bad UI. It takes control away from the user and can surprise and irritate him.

    #!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11147002 use warnings; use Tk; my $mw = new MainWindow; my $label = $mw -> Label(-text=>"Hello World") -> pack(); my $button = $mw -> Button(-activebackground => 'red', -activeforegrou +nd => 'black', -text => "Quit" ); $button->bind('<ButtonPress-1>' => \&myexit); $button->bind('<ButtonRelease-1>' => \&myexit2); $button->pack; $button->eventGenerate('<ButtonPress-1>'); $button->eventGenerate('<ButtonRelease-1>'); $mw->after(5000 => \&doit); $mw->after(10000 => \&doit2); sub doit { $button->focus; $button->eventGenerate('<ButtonPress-1>'); } sub doit2 { $button->focus; $button->eventGenerate('<ButtonRelease-1>'); } MainLoop; sub myexit { print time."\n"; } sub myexit2 { $button->configure(-background => "gray", -foreground => "black"); $button->eventGenerate('<Leave>'); # NOTE print time." 2\n"; }

      This is part of an automated script and your solution works perfectly! I guess I was missing the <leave> portion of the code which was not in the Oreilly book. Thanks again!