For Programmers: Free Programming Magazines  


Home > Archive > PERL Miscellaneous > June 2004 > Problem with Gtk2 and POE









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Problem with Gtk2 and POE
Krisztian VASAS

2004-06-28, 4:09 pm


Hello all...


I have a big problem with Gtk2 and POE (or I'm too stupid to the POE)...

Between the POE examples, there is a Gtk Interface (small counter)...
I've tried to rewrite it in Gtk2, but didn't want to work.

Neither the $kernel->yield("state_name"), nor the
$session->postback("state_name") works...

The Gtk2 interface starts, but if I press the button, nothing happens.
If I close the window, perl writes this:
"POE::Kernel's run() method was never called."

I can't understand this, because the first part of the script hasn't
changed:

POE::Session->create( inline_states =>
{
_start => \&ui_start,
ev_count => \&ui_count,
ev_clear => \&ui_clear,
});

But when I press the button, the signal_connect doesn't want to run the
$session->postback("ev_clear") command...

Can anyone tell me, why?


IroNiQ
--
Web: http://ironiq.hu
Email: iron@ironiq.hu
LinuxCounter: #331532
Rocco Caputo

2004-06-28, 4:09 pm

On Mon, 28 Jun 2004 19:12:12 +0200, Krisztian VASAS wrote:
>
> Hello all...
>
>
> I have a big problem with Gtk2 and POE (or I'm too stupid to the POE)...
>
> Between the POE examples, there is a Gtk Interface (small counter)...
> I've tried to rewrite it in Gtk2, but didn't want to work.
>
> Neither the $kernel->yield("state_name"), nor the
> $session->postback("state_name") works...


Works here. The program I tested with is nearly the same as the one on
POE's wiki. I just changed all the "Gtk"s to "Gtk2". Here's a copy:

#!/usr/bin/perl

use warnings;
use strict;

use Gtk2;
use POE;

POE::Session->create(
inline_states => {
_start => \&ui_start,
ev_count => \&ui_count,
ev_clear => \&ui_clear,
}
);

$poe_kernel->run();
exit 0;

sub ui_start {
my ( $kernel, $session, $heap ) = @_[ KERNEL, SESSION, HEAP ];

$heap->{main_window} = Gtk2::Window->new("toplevel");
$kernel->signal_ui_destroy( $heap->{main_window} );

my $box = Gtk2::VBox->new( 0, 0 );
$heap->{main_window}->add($box);
$box->show();

my $label = Gtk2::Label->new("Counter");
$box->pack_start( $label, 1, 1, 0 );
$label->show();

$heap->{counter} = 0;
$heap->{counter_label} = Gtk2::Label->new( $heap->{counter} );
$box->pack_start( $heap->{counter_label}, 1, 1, 0 );
$heap->{counter_label}->show();

my $button = Gtk2::Button->new("Clear");
$button->signal_connect( "clicked", $session->postback("ev_clear") );
$box->pack_start( $button, 1, 1, 0 );
$button->show();

$heap->{main_window}->show();

$kernel->yield("ev_count");
}

sub ui_count {
my ( $kernel, $heap ) = @_[ KERNEL, HEAP ];
$heap->{counter_label}->set_text( ++$_[HEAP]->{counter} );
$kernel->yield("ev_count");
}

sub ui_clear {
$_[HEAP]->{counter} = 0;
}

__END__

--
Rocco Caputo - http://poe.perl.org/


Krisztian VASAS

2004-06-28, 4:09 pm

Rocco Caputo wrote this on 2004-06-28 19:48:
> Works here. The program I tested with is nearly the same as the one on
> POE's wiki. I just changed all the "Gtk"s to "Gtk2". Here's a copy:


Problem solved...

Wasn't installed the POE::Loop::Gtk2...


IroNiQ
--
Web: http://ironiq.hu
Email: iron@ironiq.hu
LinuxCounter: #331532
Krisztian VASAS

2004-06-29, 8:56 pm

> Rocco Caputo wrote this on 2004-06-28 19:48:
>
>
>
> Problem solved...
>
> Wasn't installed the POE::Loop::Gtk2...


Well, now works quiet well, but I have another problem and I can't
decide what's the problem...

I write a small chat client... I use POE to handle the net connection
and the Gtk2 UI... The POE::Session starts the main window... If the
main window is ready, calls the login window...
If I miss calling the login window and connect to the server, the
program works good...
If I call the login window, the program gets a stop signal
(POE::Session->create( inline_states => _stop)...

I've tried to reduce the program to the smallest amount code that still
triggers the problem and looks like this is Gtk2's (?) fault.

Here's the code: http://www.nomorepasting.com/paste.php?pasteID=15366

Thanks...


IroNiQ
--
Web: http://ironiq.hu
Email: iron@ironiq.hu
LinuxCounter: #331532
Rocco Caputo

2004-06-30, 9:05 am

On Tue, 29 Jun 2004 22:15:17 +0200, Krisztian VASAS wrote:
>
> Well, now works quiet well, but I have another problem and I can't
> decide what's the problem...


[...]

> I've tried to reduce the program to the smallest amount code that still
> triggers the problem and looks like this is Gtk2's (?) fault.
>
> Here's the code: http://www.nomorepasting.com/paste.php?pasteID=15366


When I run that code, I get:

2) poerbook:~/projects/support% perl gtk2-client.perl
Bareword "menuitem_quit" not allowed while "strict subs" in use \
at gtk2-client.perl line 73.
BEGIN not safe after errors--compilation aborted \
at gtk2-client.perl line 243.

After I changed line 73 to be

$window->signal_connect("destroy", \&menuitem_quit );

I started getting these errors:

Gtk-WARNING **: gtk_item_factory_create_item(): Can't specify a \
callback on a branch: "/_File" at gtk2-client.perl line 85.
Gtk-WARNING **: gtk_item_factory_create_item(): Can't specify a \
callback on a branch: "/_Settings" at gtk2-client.perl line 85.
Gtk-WARNING **: gtk_item_factory_create_item(): Can't specify a \
callback on a branch: "/_Help" at gtk2-client.perl line 85.
Fontconfig error: Cannot load default config file
2 -> login (from gtk2-client.perl at 132)
2 -> _stop (from \
/Users/troc/projects/poe/poe/lib/POE/Resource/Sessions.pm at 492)

The Gtk-WARNING lines say you're not setting up @menu_items correctly.
Sure enough, they go away when I replace the 0 callbacks with undef.

The \&loginablak callback for "<control>N" should probably be
$session->postback("login") instead. The program doesn't immediately
exit when I change it here, but it also doesn't connect to a server when
I try that.

Line 203 reads

$session->postback("ar_conn")

You probably should add this to gui_start()

$kernel->alias_set("gui");

and then replace line 203 with

$poe_kernel->post("gui", "ar_conn");

.... and that makes the [Ok] button connect to the server.

I have placed an updated version of your script at
http://www.nomorepasting.com/paste.php?pasteID=15396

Have fun!

--
Rocco Caputo - http://poe.perl.org/
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com