Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Tk: listen for event generated anywhere in program

by blueberryCoffee (Scribe)
on Dec 14, 2004 at 08:52 UTC ( #414645=perlquestion: print w/replies, xml ) Need Help??

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

Hi everyone, I have searched through MTK and the pod docs and experimented myself but I'm still stumped. The code below shows that if I bind a widget to a virtual event it only responds to the event if it (the widget bound to the event) generates the event. My goal is to have the widget respond to the event no matter who/what generated the event. Am I on the right track?
#!/usr/bin/perl use Tk; use strict; my $app = new MainWindow; my $entry = $app->Entry()->pack(); $entry->bind('<<customEvent>>' => \&respondToEvent); $app->Button(-text => 'gen event by app', -command => [\&sendEvent, 0])->pack(); $app->Button(-text => 'gen event by label', -command => [\&sendEvent, 1])->pack(); MainLoop; sub sendEvent { if(@_[0]) { # have entry generate event - this works $entry->eventGenerate('<<customEvent>>'); } else { # have mainwindow generate event - this produces nill $app->eventGenerate('<<customEvent>>'); } } sub respondToEvent { print "Responding to Event!"; }

Replies are listed 'Best First'.
Re: Tk: listen for event generated anywhere in program
by zejames (Hermit) on Dec 14, 2004 at 09:45 UTC

    From the Tk bind documentation :

    ...

    $widget->bind(tag,sequence,callback);

    ...

    If a tag is the name of an internal window the binding applies to that window.

    If the tag is the name of a toplevel window the binding applies to the toplevel window and all its internal windows.

    If the tag is the name of a class of widgets, such as Tk::Button, the binding applies to all widgets in that class;

    If tag has the value all, the binding applies to all windows in the application.

    So just use the first argument of the bind call :

    #!/usr/bin/perl use Tk; use strict; my $app = new MainWindow; my $entry = $app->Entry()->pack(); $entry->bind('all', '<<customEvent>>' => \&respondToEvent); $app->Button(-text => 'gen event by app', -command => [\&sendEvent, 0])->pack(); $app->Button(-text => 'gen event by label', -command => [\&sendEvent, 1])->pack(); MainLoop; sub sendEvent { if(@_[0]) { # have entry generate event - this works $entry->eventGenerate('<<customEvent>>'); } else { # have mainwindow generate event - this produces nill $app->eventGenerate('<<customEvent>>'); } } sub respondToEvent { print "Responding to Event!"; }

    --
    zejames

    100th post ! Champaign !

      Thank you, thankyou, and thanks to you. I had spent all my time going over the event documentation, thinking it was the way the event was called rather than the actual binding. The answer was so easy, I can't believe I missed that. Thanks again.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (5)
As of 2023-01-31 11:10 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?