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

What I want is a text window that I can type the lat/long pair and then click the compile button that moves all the typed locations to a file. I'm not to clear on the TextView widget so some help would be great.

#!/usr/bin/perl -w use strict; use warnings; use Glib qw/TRUE FALSE/; use Gtk2 '-init'; #global variables my $interface; my $mapped = 0; my $progressbar_uasposition; my $progressbar_waytemp2; my $progressbar_waytemp1; my $progressbar_wayfinal; my $progressbar_waytemp3; my $progressbar_uas; #shared Variables my $die: shared = 0; my $count_waytemp3 = 0; my $count_uas = 0; my $count_uasposition = 0; my $current_controls = 0; $interface = Gtk2::Window->new('popup'); $interface->set_position('mouse'); $interface->set_border_width( 5); #Eventbox for capturing the mouse click my $eventbox_interface = Gtk2::EventBox->new; #table to contain the widgets my $table_interface = Gtk2::Table->new( 14, 2, FALSE); #spacers for the widgets my $spacer1 = Gtk2::Label->new(); my $spacer2 = Gtk2::Label->new(); my $spacer3 = Gtk2::Label->new(); my $spacer4 = Gtk2::Label->new(); #Labels my $label_downloading = Gtk2::Label->new( 'Downloading'); my $label_uploading = Gtk2::Label->new( 'Uploading'); #Bold text for the Main Labels my $fontdescription = Gtk2::Pango::FontDescription->new; $fontdescription->set_weight( 'bold'); $label_uploading->modify_font( $fontdescription); $label_downloading->modify_font( $fontdescription); #The interface for Nav #text features my $buffer = Gtk2::TextBuffer->new(); #Label my $label_nav_waypoint = Gtk2::Label->new( ); my $label_nav_waytemp = Gtk2::Label->new( 'waytemp'); my $label_nav_uas = Gtk2::Label->new( 'uaspf.txt'); #Markup for the text labels $label_nav_waypoint->set_markup( '<b>Waypoint Generation</b>'); #Create the scrolled window that the lat and long entries will be disp +layed in my $swindow_nav = Gtk2::ScrolledWindow->new( undef, undef); $swindow_nav->set_policy( 'automatic', 'automatic'); $swindow_nav->set_shadow_type( 'etched-out'); my $textview_nav = Gtk2::TextView->new; $swindow_nav->add( $textview_nav); #Buttons to compile the waypoint files my $button_nav_waypoint = Gtk2::Button->new( 'Compile/Send'); my $button_nav_connect = Gtk2::Button->new( 'Connect'); #Horizontal separator my $hseparator_nav = Gtk2::HSeparator->new; #Progressbar for the waytemp upload and the uaspf.txt download $progressbar_waytemp3 = Gtk2::ProgressBar->new; $progressbar_uas = Gtk2::ProgressBar->new; #pack the widgets into the table $table_interface->attach_defaults( $label_nav_waypoint, 0, 2, 0, 1); $table_interface->attach_defaults( $spacer1, 0, 2, 1, 2); $table_interface->attach_defaults( $swindow_nav, 0, 2, 2, 3); $table_interface->attach_defaults( $spacer2, 0, 2, 3, 4); $table_interface->attach_defaults( $button_nav_waypoint, 0, 2, 4, 5); $table_interface->attach_defaults( $spacer3, 0, 2, 5, 6); $table_interface->attach_defaults( $hseparator_nav, 0, 2, 6, 7); $table_interface->attach_defaults( $label_uploading, 0, 2, 7, 8); $table_interface->attach_defaults( $label_nav_waytemp, 0, 1, 8, 9); $table_interface->attach_defaults( $progressbar_waytemp3, 0, 2, 9, 10) +; $table_interface->attach_defaults( $spacer4, 0, 2, 10, 11); $table_interface->attach_defaults( $label_downloading, 0, 2, 11, 12); $table_interface->attach_defaults( $label_nav_uas, 0, 1, 12, 13); $table_interface->attach_defaults( $progressbar_uas, 0, 2, 13, 14); $table_interface->attach_defaults( $button_nav_connect, 1, 2, 14, 15); #Button function; starts the connection $button_nav_waypoint->signal_connect( 'button-press-event' => sub { my + $num = $buffer->get_buffer; print "$num\n"}); $button_nav_connect->signal_connect( 'button-press-event' => sub { my +$button_nav_label = $button_nav_connect->get_label; if ( $button_nav_l +abel eq 'Connect') { $button_nav_co +nnect->set_label( 'Disconnect'); } else { $button_nav_co +nnect->set_label( 'Connect'); } }); #add the widgets to the window: widgets->table->eventbox->window $eventbox_interface->add( $table_interface); $interface->add( $eventbox_interface); $interface->show_all; $interface->signal_connect( 'button-release-event' => sub { Gtk2->main +_quit}); #allows the popup window entries to work correctly my $rc = Gtk2::Gdk->keyboard_grab($interface->window, 0 ,Gtk2->get_cur +rent_event_time); Gtk2->main;

Replies are listed 'Best First'.
Re: Gtk2: TextView to file
by Anonymous Monk on Aug 09, 2007 at 09:49 UTC
      OK, more specifically, how do I grab what is typed and drop that into a file? I think I have to get the stuff typed into a buffer and then get the iter and..... but I dont know how to get that stuff into the buffer, any ideas?
      I'm sorry you haven't joined the Monastery; I ++'ed your answer, but you won't benefit from it...
        he joined the monastery but decided to post this answer anonymously
        May be he just needed to have a little rest of non-anonymous posts...
Re: Gtk2: TextView to file
by zentara (Cardinal) on Aug 09, 2007 at 21:02 UTC
    Under normal conditions, if you just had a plain textview in a normal window, all you would need to do is:
    my $string = $buffer->get_text($buffer->get_start_iter, $buffer->get_end_iter, 1); print "$string\n";
    BUT.... since you are trying to get fancy and use popup windows, you are getting some sort of weird focus problem. The popup type of window is specialized and does not have all the features of a full-fledged window. Now I have 2 suggestions:

    1. Ask on the Gtk2 Perl maillist and hope one of the real experts answers you. They may not know.

    2. Change your popup to a toplevel, and you can remove the WM decorations to make it look like a popup.

    #!/usr/bin/perl use warnings; use strict; use Glib qw/TRUE FALSE/; use Gtk2 '-init'; # works on any ICCWM compliant window manager my $window = Gtk2::Window->new(); $window->set_decorated(0); Gtk2::Window::set_decorated($window, 0); print $window->get_decorated(),"\n"; $window ->signal_connect( 'destroy' => \&delete_event ); $window->set_border_width(10); $window->set_size_request(300,200); my $vbox = Gtk2::VBox->new( FALSE, 6 ); $window->add($vbox); $vbox->set_border_width(2); my $hbox= Gtk2::HBox->new( FALSE, 6 ); $vbox->pack_end($hbox,FALSE,FALSE,0); $hbox->set_border_width(2); my $button = Gtk2::Button->new_from_stock('gtk-quit'); $hbox->pack_end( $button, FALSE, FALSE, 0 ); $button->signal_connect( clicked => \&delete_event ); $window->set_position('center'); $window->show_all(); Gtk2->main; ##################################### sub delete_event { Gtk2->main_quit; return FALSE; }

    I'm not really a human, but I play one on earth. Cogito ergo sum a bum
      I tried the suggestions that were offered but nothing is printed out in the terminal. EDIT: Nevermind I got it to work. It needed the code "my $buffer = $textview_nav->get_buffer". Also, I noticed that this seems to work with a 'popup' window. I'm still writing the code so I hope it will have no problems. Yeah I know, I'm very fancy!!
      #!/usr/bin/perl -w use strict; use warnings; use Glib qw/TRUE FALSE/; use Gtk2 '-init'; #global variables my $interface; my $mapped = 0; my $progressbar_uasposition; my $progressbar_waytemp2; my $progressbar_waytemp1; my $progressbar_wayfinal; my $progressbar_waytemp3; my $progressbar_uas; #shared Variables my $die: shared = 0; my $count_waytemp3 = 0; my $count_uas = 0; my $count_uasposition = 0; my $current_controls = 0; $interface = Gtk2::Window->new('popup'); $interface->set_position('mouse'); $interface->set_border_width( 5); #$interface->set_decorated(0); #Gtk2::Window::set_decorated($interface, 0); #Eventbox for capturing the mouse click my $eventbox_interface = Gtk2::EventBox->new; #table to contain the widgets my $table_interface = Gtk2::Table->new( 14, 2, FALSE); #spacers for the widgets my $spacer1 = Gtk2::Label->new(); my $spacer2 = Gtk2::Label->new(); my $spacer3 = Gtk2::Label->new(); my $spacer4 = Gtk2::Label->new(); #Labels my $label_downloading = Gtk2::Label->new( 'Downloading'); my $label_uploading = Gtk2::Label->new( 'Uploading'); #Bold text for the Main Labels my $fontdescription = Gtk2::Pango::FontDescription->new; $fontdescription->set_weight( 'bold'); $label_uploading->modify_font( $fontdescription); $label_downloading->modify_font( $fontdescription); #The interface for Nav #text features my $buffer = Gtk2::TextBuffer->new(); #Label my $label_nav_waypoint = Gtk2::Label->new( ); my $label_nav_waytemp = Gtk2::Label->new( 'waytemp'); my $label_nav_uas = Gtk2::Label->new( 'uaspf.txt'); #Markup for the text labels $label_nav_waypoint->set_markup( '<b>Waypoint Generation</b>'); #Create the scrolled window that the lat and long entries will be disp +layed in my $swindow_nav = Gtk2::ScrolledWindow->new( undef, undef); $swindow_nav->set_policy( 'automatic', 'automatic'); $swindow_nav->set_shadow_type( 'etched-out'); my $textview_nav = Gtk2::TextView->new; $swindow_nav->add( $textview_nav); #Buttons to compile the waypoint files my $button_nav_waypoint = Gtk2::Button->new( 'Compile/Send'); my $button_nav_connect = Gtk2::Button->new( 'Connect'); #Horizontal separator my $hseparator_nav = Gtk2::HSeparator->new; #Progressbar for the waytemp upload and the uaspf.txt download $progressbar_waytemp3 = Gtk2::ProgressBar->new; $progressbar_uas = Gtk2::ProgressBar->new; #pack the widgets into the table $table_interface->attach_defaults( $label_nav_waypoint, 0, 2, 0, 1); $table_interface->attach_defaults( $spacer1, 0, 2, 1, 2); $table_interface->attach_defaults( $swindow_nav, 0, 2, 2, 3); $table_interface->attach_defaults( $spacer2, 0, 2, 3, 4); $table_interface->attach_defaults( $button_nav_waypoint, 0, 2, 4, 5); $table_interface->attach_defaults( $spacer3, 0, 2, 5, 6); $table_interface->attach_defaults( $hseparator_nav, 0, 2, 6, 7); $table_interface->attach_defaults( $label_uploading, 0, 2, 7, 8); $table_interface->attach_defaults( $label_nav_waytemp, 0, 1, 8, 9); $table_interface->attach_defaults( $progressbar_waytemp3, 0, 2, 9, 10) +; $table_interface->attach_defaults( $spacer4, 0, 2, 10, 11); $table_interface->attach_defaults( $label_downloading, 0, 2, 11, 12); $table_interface->attach_defaults( $label_nav_uas, 0, 1, 12, 13); $table_interface->attach_defaults( $progressbar_uas, 0, 2, 13, 14); $table_interface->attach_defaults( $button_nav_connect, 1, 2, 14, 15); #Button function; starts the connection $button_nav_waypoint->signal_connect( 'button-press-event' => sub {my +$buffer = $textview_nav->get_buffer; my $string = $buffer->get_text($ +buffer->get_start_iter, $buffer->get_end_iter, 1); print "$string\n"; +}); $button_nav_connect->signal_connect( 'button-press-event' => sub { my +$button_nav_label = $button_nav_connect->get_label; if ( $button_nav_l +abel eq 'Connect') { $button_nav_co +nnect->set_label( 'Disconnect'); } else { $button_nav_co +nnect->set_label( 'Connect'); } }); #add the widgets to the window: widgets->table->eventbox->window $eventbox_interface->add( $table_interface); $interface->add( $eventbox_interface); $interface->show_all; $interface->signal_connect( 'button-release-event' => sub { Gtk2->main +_quit}); #allows the popup window entries to work correctly my $rc = Gtk2::Gdk->keyboard_grab($interface->window, 0 ,Gtk2->get_cur +rent_event_time); Gtk2->main;
        It needed the code "my $buffer = $textview_nav->get_buffer".

        Doh!!! I shouldn't have missed that. I see the problem now.... in your code you create the textview (with a an automatic buffer ), and you thought it was using $buffer.

        #my $textview_nav = Gtk2::TextView->new; # should have been my $textview_nav = Gtk2::TextView->new_with_buffer($buffer);
        If you had used new_with_buffer($buffer) , then reading from the global $buffer would have worked. As it now is written, your global $buffer is unused.

        P.S. You might also want to add a line to make the textview have the cursor when it opens.

        my $rc = Gtk2::Gdk->keyboard_grab($textview_nav->window, 0 , Gtk2->get_current_event_time);

        I'm not really a human, but I play one on earth. Cogito ergo sum a bum