Can anyone use perlapp and successfully build a working *.exe for any perl script that uses both POE and Tk?
I can't, and am very confused and frustrated.
# http://poe.perl.org/?POE_Cookbook/Tk_Interfaces # # This sample program creates a very simple Tk counter. Its interface # consists of three widgets: A rapidly increasing counter, and a # button to reset that counter. use warnings; use strict; # Tk support is enabled if the Tk module is used before POE itself. use Tk; use POE; # Create the session that will drive the user interface. POE::Session->create ( inline_states => { _start => \&ui_start, ev_count => \&ui_count, ev_clear => \&ui_clear, } ); # Run the program until it is exited. $poe_kernel->run(); exit 0; sub ui_start { my ( $kernel, $session, $heap ) = @_[ KERNEL, SESSION, HEAP ]; if(! defined($poe_main_window)) { die "\$poe_main_window not defin +ed" }; $poe_main_window->Label( -text => "Counter" )->pack; $heap->{counter_widget} = $poe_main_window->Label( -textvariable => \$heap->{counter} )->p +ack; $poe_main_window->Button ( -text => "Clear", -command => $session->postback("ev_clear") )->pack; $poe_main_window->update; $kernel->yield("ev_count"); } # Handle the "ev_count" event by increasing a counter and displaying # its new value. sub ui_count { $_[HEAP]->{counter}++; $poe_main_window->update; sleep(1); $_[KERNEL]->yield("ev_count"); } # Handle the "ev_clear" event by clearing and redisplaying the # counter. sub ui_clear { $_[HEAP]->{counter} = 0; }
perlapp --add "POE::Wheel" --add "POE::Loop::Tk" --add "POE::Loop::Sel +ect" --add "POE::Resource::Aliases" --add "POE::Resource::Events" --a +dd "POE::Resource::Extrefs" --add "POE::Resource::FileHandles" --add +"POE::Resource::SIDs" --add "POE::Resource::Sessions" --add "POE::Res +ource::Signals" --add "POE::Resource::Statistics" --add "POE::Session +" --add "POE::Driver::SysRW" --add "POE::Filter::Line" --verbose --cl +ean --force --lib lib --exe tst121.exe tst121.pl
However, anytime it is run it will die claiming that poe_main_window is not defined (remember the error check I added?). Oh, and also note that the *.pl script works fine and the *.exe doesn't on the same machine. Grrrrr.
In fact, I have already asked about this problem here at perlmonks, without really knowing it is a poe_main_window problem. In that code, you'll notice I did a sneaky thing with the lines:
In Rocco's response he questioned this, but I never followed up (Note-to-self: NEVER use MainWindow->new() when POE is in the mix...).# WHY DO I HAVE TO DO THIS???? my $top = $poe_main_window || MainWindow->new();
So... it it possible to do this, and if so, how?
Many thanks!
-Craig
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |