Re: updating gui while running a subroutine
- From: zentara <zentara1 sbcglobal net>
- To: gtk-perl-list gnome org
- Subject: Re: updating gui while running a subroutine
- Date: Fri, 30 Jan 2009 12:19:45 -0500
On Fri, 30 Jan 2009 12:51:44 -0400
Daniel Gaston <daniel gaston gmail com> wrote:
Hi folks, looking for a little assistance, and I'm sure it is just something
simple that I can do to fix this. Using the information from an earlier
thread I have it so when my GUI is running an external program a text-view
that I have for monitoring progress updates. I've done this as Muppet
recommended using the following:
I want to call this first subroutine in a similar manner to above so that
the GUI will still update with progress messages as I do in the above
example.
Is there something special I need to do with the piped open/fork to have it
work for a subroutine within the same program code?
Thanks.
Dan Gaston
Hi, there are many ways to do what you want, but here is a simple way,
using the Gtk::Helper instead of IO::Watch.
I repeatedly run "date" every 3 seconds as the spawned command, but you
could work out something more elaborate.
I may not be understanding the complexity of your question, so test,test ,test. :-)
#!/usr/bin/perl -w
use strict;
use Glib qw(TRUE FALSE);
use Gtk2 -init;
use Gtk2::Helper;
use IO::Pipe;
#standard window creation, placement, and signal connecting
my $window = Gtk2::Window->new('toplevel');
$window->signal_connect('delete_event' => sub { exit;});
$window->set_border_width(5);
$window->set_position('center_always');
my $hbox = Gtk2::HBox->new();
$hbox->set( "border_width" => 0 );
$window->add($hbox);
my $scroll = Gtk2::ScrolledWindow->new;
$scroll->set_size_request(600,600);
my $textview = Gtk2::TextView->new;
my $buffer = $textview->get_buffer;
create_tags($buffer);
$scroll->add($textview);
$hbox->pack_start($scroll,1, 1, 1 ); # expand?, fill?, padding;
$window->show_all();
my $helper_tag;
my $timer = Glib::Timeout->add (3000, \&launch );
#our main event-loop
Gtk2->main;
sub launch{
#open a pipe to a command
my $fh = new IO::Pipe;
$fh->reader("date");
#$fh->reader("counter1.pl");
#add a watch to this file handle
$helper_tag = Gtk2::Helper->add_watch(fileno $fh, 'in',sub{
&watch_callback($fh);
});
return 1; #keep timer going
}
sub watch_callback {
my ($fh) = @_;
my $line;
#read 1000 caracters of the buffer
$fh->sysread($line,1000);
#remove the newline
# print $line;
chomp $line;
if($line){
$buffer->insert_with_tags_by_name($buffer->get_end_iter, "$line\n",'blue');
}else{
Gtk2::Helper->remove_watch($helper_tag);
}
#absolutely need the main iteration here, or you
#won't get the end iter correctly
Gtk2->main_iteration while Gtk2->events_pending;
$textview->scroll_to_iter($buffer->get_end_iter,0,0,0,0);
# my $end_mark = $buffer->create_mark( 'end', $buffer->get_end_iter, FALSE );
# $textview->scroll_to_mark( $end_mark, 0.0, FALSE, 0.0, 1.0 );
#important so we can loop again
return 1;
}
###########################3
sub create_tags{
my $buffer = shift;
$buffer->create_tag('blue',
foreground => 'blue',
);
$buffer->create_tag('col',
foreground => 'green',
);
}
##############
__END__
Hope it shows you a simple way. Gtk::Helper makes filehandle watching
a bit easier.
Goodluck,
zentara
--
I'm not really a human, but I play one on earth.
http://www.zentara.net/~zentaran/Remember_How_Lucky_You_Are.html
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]