• Publicidad

Gtk2, volver a una interfaz anterior

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Gtk2, volver a una interfaz anterior

Notapor ccorrales001 » 2010-06-07 06:34 @315

Hola, perleros,
tengo una pequeña duda, a ver si me la podéis resolver.

Tengo hecha una aplicación que tiene un total de 4 interfaces encadenadas. Es decir, empieza con una interfaz en la que el usuario elige un idioma, y se le abre otra interfaz dependiendo del idioma, en la cual debe elegir otras opciones etc.

Lo que deseo es que una vez elegido el idioma, en la nueva interfaz que se abre, poner un botón de "atrás", es decir, que vuelva a la interfaz anterior.

He probado distintas opciones, pero en vez de destruirme esta interfaz, sale del programa. También he probado a hacer otra vez la llamada a la interfaz anterior, pero lógicamente, en vez de destruirme ésta, me vuelve a crear la anterior.
Este es la parte del código correspondiente a ese botón:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $hbox = Gtk2::HBox->new(0, 0);
$hbox->set_border_width(5);
$hbox->set_size_request(100,50);
my $boton_atras = Gtk2::Button->new_from_stock('Atrás');
$boton_atras->signal_connect('clicked'  => sub { Gtk2->main_quit;  });
$hbox->pack_start($boton_atras, FALSE, FALSE, 2);
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Esta opción es la que me saca de la aplicación entera. No sé si me he explicado bien. Espero que me puedan ayudar.
Saludos.
ccorrales001
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2009-01-29 12:01 @543

Publicidad

Re: Gtk2, volver a una interfaz anterior

Notapor explorer » 2010-06-07 12:47 @574

Quizás haya que cambiar la llamada a quit() con la llamada de presentación de la caja de diálogo que deseamos presentar (después de haber quitado de la pantalla el diálogo actual).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Gtk2, volver a una interfaz anterior

Notapor ccorrales001 » 2010-06-08 04:15 @219

Hola explorer, no entiendo muy bien lo que me quieres decir.
Yo estoy haciendo con Gtk2::Window, ¿es mejor hacer las interfaces con Gtk2::Dialog?
ccorrales001
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2009-01-29 12:01 @543

Re: Gtk2, volver a una interfaz anterior

Notapor explorer » 2010-06-08 06:13 @300

No...

A ver, yo no conozco mucho de Gtk2, pero los interfaces gráficos se parecen mucho unos a otras...

Yo, lo que entiendo, es que si quiero que desde una ventana aparezca otra, y al desaparecer la segunda vuelva a aparecer la primera, se me ocurren dos opciones básicas:

* la segunda es llamada desde la primera, como una subrutina, por lo que al cerrarse, me devuelve el control

* la primera llama a la segunda, y termina. Y la segunda, cuando termine, que abra de nuevo la primera.

No sé si te estoy liando más. Quería decir que en vez de mandar cerrar la aplicación cuando el usuario cierra la ventana, lo que hacemos es, primero dar la orden de cerrarla y luego abrimos la siguiente ventana. Lo que no sé es si se pueden acumular llamadas de apertura y cierre de ventanas, en Gtk2, de esta manera.

¿Nos podrías enviar un ejemplo de código Gtk2 en la que se abra una ventana y ceda el control a una segunda?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Gtk2, volver a una interfaz anterior

Notapor ccorrales001 » 2010-06-08 06:36 @316

Hola explorer,
la primera opción es la que he estado intentando hacer todo este tiempo, es decir, a través de subrutinas. El problema es que no he averiguado cómo devolver el control a la primera interfaz, ya que lo único que consigo es cerrar toda la aplicación.

Este es el código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub _init{
  2.  
  3.         my($ventana, $imagen, $footer, $opciones, $togglebutton1, $togglebutton2, $vbox);
  4.  
  5.         $ventana = Gtk2::Window->new('toplevel');
  6.         $ventana->set_border_width(20);
  7.         $ventana->set_title('Generador automático de resúmenes');
  8.        
  9.         $imagen = Gtk2::Image->new_from_file("informatica.jpg");
  10.         $footer = Gtk2::Label->new( 'Choose language/ Elija idioma' );
  11.  
  12.        
  13.         #Boton de cancelar
  14.         my $hbox2 = Gtk2::HBox->new(0, 5);
  15.         $hbox2->set_border_width(1);
  16.  
  17.         my $boton_cancelar = Gtk2::Button->new_from_stock('gtk-cancel');
  18.         $boton_cancelar->signal_connect('clicked' => sub {Gtk2->main_quit; });
  19.         $boton_cancelar->set_size_request(100, 30);
  20.  
  21.         #Boton de ayuda
  22.         my $boton_ayuda = Gtk2::Button->new_from_stock('gtk-help');
  23.         $boton_ayuda->signal_connect('clicked' => sub { &ayuda_idioma()});
  24.         $boton_ayuda->set_size_request(100, 30);
  25.        
  26.         $hbox2->pack_start($boton_ayuda, FALSE, FALSE, 2);
  27.         $hbox2->pack_start($boton_cancelar, FALSE, FALSE, 2);  
  28.        
  29.         sub ayuda_idioma{
  30.                 my $about = Gtk2::Dialog->new( 'Ayuda/Help', undef, 'modal',
  31.                                    'Atrás' => 'ok' );
  32.  
  33.                 my $text =<<INFO;
  34. Tiene usted que elegir el idioma en el que desea realizar la búsqueda.
  35.  
  36. You have to choose the language in which you want to make the search.
  37.                
  38. INFO
  39.  
  40.                  # Podemos observar como un objeto Gtk2::Dialog contiene un vbox internamente
  41.                  # para poder empaquetarle otros items.
  42.  
  43.                 my $imagen = Gtk2::Image->new_from_file("ayuda2.png");
  44.                 $about->vbox->pack_start( $imagen, FALSE, FALSE, 4 );
  45.                 $about->vbox->pack_start( Gtk2::Label->new( $text ), FALSE, FALSE, 4 );
  46.                 $about->vbox->show_all;
  47.  
  48.                  # Simplemente, presionamos el botón y cerramos la ventana.
  49.                  $about->destroy if $about->run;
  50.                 return TRUE;
  51.  
  52.  
  53.  
  54.         }
  55.  
  56.         #$opciones=&create_option_bar();
  57.  
  58.         my $hbox3 = Gtk2::HBox->new( FALSE, 0 );
  59.  
  60.         $togglebutton1 = Gtk2::ToggleButton->new_with_label('Castellano');
  61.         $togglebutton2 = Gtk2::ToggleButton->new_with_label('English');
  62.  
  63.         $togglebutton1->set_size_request(100, 30);
  64.         $togglebutton2->set_size_request(100, 30);
  65.  
  66.  
  67.  
  68.         $togglebutton1->signal_connect('clicked' => sub { &abrir_castellano() });
  69.         $togglebutton2->signal_connect('clicked' => sub { &abrir_ingles() });
  70.  
  71.         $hbox3->pack_start( $togglebutton1, FALSE, FALSE, 3 );
  72.         $hbox3->pack_start( $togglebutton2, FALSE, FALSE, 3 );
  73.  
  74.         my $separador = Gtk2::HSeparator->new();
  75.         $separador->set_size_request(400, 30);
  76.  
  77.  
  78.         $vbox = Gtk2::VBox->new( FALSE, 0 );
  79.         $vbox->pack_start( $footer, FALSE, FALSE, 3 );
  80.         $vbox->pack_start( Gtk2::HSeparator->new, FALSE, FALSE, 3 );
  81.         $vbox->pack_start( $imagen, FALSE, FALSE, 3 );
  82.         $vbox->pack_start( $hbox3, FALSE, FALSE, 3 );
  83.         $vbox->pack_start( $separador, FALSE, FALSE, 3 );
  84.         $vbox->pack_end( $hbox2, FALSE, FALSE, 3 );
  85.        
  86.  
  87.         $ventana->add($vbox);
  88.         $ventana->set_position('center');
  89.         $ventana->show_all;
  90.         return;
  91.        
  92. }
  93. _init;
  94. Gtk2->main;
  95.  
  96. sub abrir_ingles{
  97.  
  98.  
  99.         my $ventana = Gtk2::Window->new('toplevel');
  100.         $ventana->set_border_width(20);
  101.         $ventana->set_title('Interface 2');
  102.  
  103.         my $imagen = Gtk2::Image->new_from_file("informatica.jpg");
  104.         my $footer =  Gtk2::Label->new( 'Choose kind of summary' );
  105.  
  106.        
  107.         #Boton de cancelar
  108.         my $hbox2 = Gtk2::HBox->new(0, 0);
  109.         $hbox2->set_border_width(5);
  110.         my $boton_cancelar = Gtk2::Button->new_from_stock('gtk-cancel');
  111.         $boton_cancelar->signal_connect('clicked' => sub {Gtk2->main_quit; });
  112.        
  113.         #Boton de ayuda
  114.         my $boton_ayuda = Gtk2::Button->new_from_stock('gtk-help');
  115.         $boton_ayuda->signal_connect( 'clicked' => \&about_this_ingles);
  116.  
  117.         $boton_ayuda->set_size_request(100, 30);
  118.         $boton_cancelar->set_size_request(100, 30);
  119.  
  120.         $hbox2->pack_start($boton_ayuda, FALSE, FALSE, 2);
  121.         $hbox2->pack_start($boton_cancelar, FALSE, FALSE, 2);
  122.        
  123.  
  124.         #$opciones=&create_option_bar();
  125.  
  126.         my $togglebutton1 = Gtk2::ToggleButton->new_with_label('Free summary');
  127.         my $togglebutton2 = Gtk2::ToggleButton->new_with_label('Most important paragraph');
  128.         my $togglebutton3 = Gtk2::ToggleButton->new_with_label('10 lines');
  129.  
  130.         $togglebutton1->signal_connect('clicked' => sub { &abrir_resumen_libre_ingles() });
  131.  
  132.         $togglebutton2->signal_connect('clicked' => sub { &abrir_parrafo_mas_ingles() });      
  133.  
  134.         $togglebutton3->signal_connect('clicked' => sub { &abrir_10_lineas_ingles()});
  135.  
  136.         my $vbox1 = Gtk2::VBox->new( FALSE, 0 );
  137.         $vbox1->pack_start( $togglebutton1, FALSE, FALSE, 3 );
  138.         $vbox1->pack_start( $togglebutton2, FALSE, FALSE, 3 );
  139.         $vbox1->pack_start( $togglebutton3, FALSE, FALSE, 3 );
  140.  
  141.         my $separador = Gtk2::HSeparator->new();
  142.         $separador->set_size_request(400, 30);
  143.  
  144.                        
  145.         my $vbox = Gtk2::VBox->new( FALSE, 0 );
  146.         $vbox->pack_start( $footer, FALSE, FALSE, 3 );
  147.         $vbox->pack_start( Gtk2::HSeparator->new, FALSE, FALSE, 3 );
  148.         $vbox->pack_start( $imagen, FALSE, FALSE, 3 );
  149.         $vbox->pack_start( $vbox1, FALSE, FALSE, 3 );
  150.         $vbox->pack_start( $separador, FALSE, FALSE, 3 );
  151.         $vbox->pack_start( $hbox2, FALSE, FALSE, 3 );
  152.        
  153.  
  154.  
  155.         $ventana->add($vbox);
  156.         $ventana->set_position('center');
  157.         $ventana->show_all;
  158.         return;
  159. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Como ves, cada vez que pulsas te abre una subrutina, que es una nueva interfaz. Aquí me faltaría el botón de atrás, que es el que quiero agregar, pero de momento imagínate que en la interfaz principal, el de Cancelar es el de atrás.
ccorrales001
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2009-01-29 12:01 @543

Re: Gtk2, volver a una interfaz anterior

Notapor explorer » 2010-06-08 07:25 @350

Claro... llamar a main_quit() siempre termina la aplicación actual.

Lo que debes hacer es cerrar la ventana. Lo que no me acuerdo es si es con un destroy() o con otra función que tenga un nombre parecido. Vamos, sustituir main_quit() por la llamada que se encarga de cerrar la ventana.

Actualización: en la página de Gtk2::Window, pone que para destruir una ventana (sin salir de la aplicación), se puede llamar, efectivamente, a destroy(): $ventana->destroy(); .

Pero... hay algo aún más interesante: en vez de crear/destruir las ventanas, puedes, simplemente crearlas todas en el arranque (como tienes en el init()), pero haciendo que estén ocultas (hidden). Mostrarlas cuando haga falta, y, para ocultarlas

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$dialog->signal_connect
      (delete_event => \&Gtk2::Widget::hide_on_delete
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Así no son destruidas, solo ocultas, por lo que no hay que crearlas de nuevo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Gtk2, volver a una interfaz anterior

Notapor ccorrales001 » 2010-06-08 09:33 @440

Gracias, explorer, lo probaré y te comento.
Un saludo.
ccorrales001
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2009-01-29 12:01 @543

Re: Gtk2, volver a una interfaz anterior

Notapor explorer » 2010-06-08 12:33 @564

Este es un ejemplo que muestra dos ventanas, en la que la segunda solo aparece a partir de la primera.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use Gtk2 '-init';
  7. use Glib qw/TRUE FALSE/;
  8.  
  9. # Creamos el aspecto gráfico
  10. our $ventana_secundaria;
  11.  
  12. sub salir_aplicacion {
  13.     Gtk2->main_quit();
  14.     exit;
  15. }
  16.  
  17. sub esconde_ventana {
  18.     $ventana_secundaria->hide();
  19.     TRUE;
  20. }
  21.  
  22.  
  23. ### Ventanas
  24.  
  25. ## Primera ventana
  26. my $ventana_principal = Gtk2::Window->new ('toplevel');
  27.  
  28. $ventana_principal->set_border_width(20);
  29. $ventana_principal->set_title('Principal');
  30.  
  31. $ventana_principal->signal_connect(delete_event => \&salir_aplicacion);
  32.  
  33. $ventana_principal->set_position('center');
  34.  
  35. my $boton_salida = Gtk2::Button->new('Salir');
  36. $boton_salida->signal_connect (clicked => \&salir_aplicacion);
  37.  
  38. my $boton_ventana_secundaria = Gtk2::Button->new('Secundaria');
  39. $boton_ventana_secundaria->signal_connect('clicked' => sub { $ventana_secundaria->present });
  40.  
  41.  
  42. my $hbox2 = Gtk2::HBox->new(0, 0);
  43. $hbox2->set_border_width(5);
  44.  
  45. $hbox2->pack_start($boton_salida, FALSE, FALSE, 2);
  46. $hbox2->pack_start($boton_ventana_secundaria, FALSE, FALSE, 2);
  47.  
  48. $ventana_principal->add($hbox2);
  49.  
  50. # Presentación de la ventana principal
  51. $ventana_principal->show_all;
  52.  
  53.  
  54. ## Segunda ventana
  55. $ventana_secundaria = Gtk2::Window->new ('toplevel');
  56.  
  57. $ventana_secundaria->set_border_width(20);
  58. $ventana_secundaria->set_title('Secundaria');
  59.  
  60. $ventana_secundaria->set_position('center');
  61.  
  62. $ventana_secundaria->signal_connect(
  63.     delete_event => \&esconde_ventana,
  64. );
  65.  
  66. my $boton_salida2 = Gtk2::Button->new('Salir a principal');
  67. $boton_salida2->signal_connect (
  68.     clicked      => \&esconde_ventana,
  69. );
  70.  
  71. my $hbox3 = Gtk2::HBox->new(0, 0);
  72. $hbox3->set_border_width(5);
  73.  
  74. $hbox3->pack_start($boton_salida2, FALSE, FALSE, 2);
  75.  
  76. $ventana_secundaria->add ($hbox3);
  77.  
  78. $hbox3->show_all; # mandamos la señal de representar todos los objetos dentro
  79.                   # de la ventana secundaria, antes de verlo en pantalla
  80.  
  81. # ¡Adelante!
  82. Gtk2->main;
  83.  
  84. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Lo curioso, y no he encontrado el porqué, es el muy distinto comportamiento que tiene la ventana secundaria si se esconde pulsando con el botón o con cerrándola: en un caso guarda la posición de pantalla, y en otra caso, no.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Gtk2, volver a una interfaz anterior

Notapor ccorrales001 » 2010-06-10 11:47 @532

Gracias explorer, me han servido tus aclaraciones.
Eres un crack, saludos.
ccorrales001
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2009-01-29 12:01 @543


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron