Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Change Color on Button Release

by PilotinControl (Pilgrim)
on Sep 20, 2022 at 02:13 UTC ( #11147002=perlquestion: print w/replies, xml ) Need Help??

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!

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://11147002]
Approved by GrandFather
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (5)
As of 2022-10-05 22:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My preferred way to holiday/vacation is:











    Results (25 votes). Check out past polls.

    Notices?