Página 1 de 2

Cómo coger datos de un combobox

NotaPublicado: 2009-09-08 13:13 @592
por oihantze
¡Hola!

Estoy trabajando con las interfaces gráficas de gtk2 y acabo de hacer un combobox para que el usuario elija un número.

La cosa es que... ¿cómo sé yo cuál de todos los números ha pulsado? ¿Y si quiero luego pasarle en una variable a otra interfaz el número pulsado... ¿cómo lo hago?

Esto es lo que yo he escrito:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$tabla_combo= Gtk2::Table->new(2,3,TRUE);
$comboBox = Gtk2::ComboBox-> new_text;      
$model = $comboBox->get_model;
$model->set ($model->append, 0, "1");
$model->set ($model->append, 0, "2");
$model->set ($model->append, 0, "3");
           [...]
$model->set ($model->append, 0, "30");
$tabla_combo->attach_defaults($comboBox, 1,2,1,2);
$tabla_contenedor->attach_defaults($tabla_combo, 1,2,3,4);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Un saludo.

Oihantze

Re: Cómo coger datos de un combobox

NotaPublicado: 2009-09-08 14:51 @660
por explorer
Pues según la página de manual, debería ser get_active_text().

Re: Cómo coger datos de un combobox

NotaPublicado: 2009-09-10 11:51 @535
por oihantze
Pero me da este error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
***   Can't locate object method "get_active" via package "Gtk2::ListStore" at ./num_docs.pl line 76.
***  ignoring at ./num_docs.pl line 73.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Por qué puede ser?

Re: Cómo coger datos de un combobox

NotaPublicado: 2009-09-10 12:16 @552
por explorer
Sin ver el código, es difícil de decir. Por el tipo de error parece que no se ha cargado el módulo. Que quizás falta hacer algún use.

Re: Cómo coger datos de un combobox

NotaPublicado: 2009-09-11 03:03 @169
por oihantze
Este es el código, si falta un use ¿cuál puede ser? Es que tengo todas las interfaces hechas ya, ¡y solamente me falta el comboBox por arreglar!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use Gtk2 '-init';
  4. use Glib qw/TRUE FALSE/; #pa q valgan los valores true y false
  5.  
  6. $ventana = Gtk2::Window->new('toplevel');
  7. $ventana->set_title('Documentos');
  8. $ventana->set_border_width(20); #el borde de la ventana de 20px
  9.  
  10. $tabla_contenedor = Gtk2::Table->new(3,7, FALSE);
  11.  
  12. $frase = Gtk2::Label->new('Indique cuantos documentos desea buscar');
  13. $tabla_contenedor->attach_defaults($frase, 1,2,1,2);
  14.  
  15. $tabla_combo= Gtk2::Table->new(2,3,TRUE);
  16. $comboBox = Gtk2::ComboBox-> new_text;    
  17. $model = $comboBox->get_model;
  18. $model->set ($model->append, 0, "1");
  19. $model->set ($model->append, 0, "2");
  20.             [...]
  21. $model->set ($model->append, 0, "29");
  22. $model->set ($model->append, 0, "30");
  23. $tabla_combo->attach_defaults($comboBox, 1,2,1,2);
  24. $tabla_contenedor->attach_defaults($tabla_combo, 1,2,3,4);
  25.  
  26. $tabla_botones = Gtk2::Table->new(3,5, TRUE);
  27.  
  28. $boton_atras = Gtk2::Button->new_with_label('Atras');
  29. $boton_atras->signal_connect('clicked' => sub { &atras($ARGV[3],$ARGV[0])});
  30. $tabla_botones->attach_defaults($boton_atras, 1,2,1,2);
  31.  
  32. $boton_ok = Gtk2::Button->new_from_stock('gtk-ok');
  33. $boton_ok->signal_connect('clicked' => sub { &ir_a($ARGV[0],$ARGV[1],$ARGV[2],$ARGV[3],$ARGV[4],$ARGV[5])});
  34. $tabla_botones->attach_defaults($boton_ok, 3,4,1,2);
  35.  
  36. $tabla_contenedor->attach_defaults($tabla_botones, 1,2,5,6);
  37.  
  38. $rc_style = Gtk2::RcStyle->new;
  39. $rc_style->bg_pixmap_name('normal', 'fondo.jpg');
  40. $ventana->modify_style($rc_style);
  41. $ventana->set_keep_above(TRUE);
  42. $ventana->add($tabla_contenedor);
  43. $ventana->set_default_size(200,200);
  44. $ventana->move(380, 300);
  45. $ventana->set_resizable(FALSE);
  46. $ventana->show_all;
  47.  
  48. Gtk2->main;
  49.  
  50. sub ir_a {
  51.        
  52.         exec "./ejecutando_estoy_en_noja.pl 15 $_[0] $_[1] $_[2] $_[3] $_[4] $_[5]";
  53. }
  54.  
  55. sub atras{
  56.         my $punto=".";
  57.         exec "$punto$_[0] $_[1]";
  58. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Re: Cómo coger datos de un combobox

NotaPublicado: 2009-09-11 03:05 @170
por explorer
¿use Gtk2::ComboBox;?

Re: Cómo coger datos de un combobox

NotaPublicado: 2009-09-11 03:24 @183
por oihantze
Si, pero poniendo ese use() me da este error.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Can't locate Gtk2/ComboBox.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at ./num_docs.pl line 5.
BEGIN failed--compilation aborted at ./num_docs.pl line 5.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


que line 5 es donde está puesto lo de use Gtk2::ComboBox;

Re: Cómo coger datos de un combobox

NotaPublicado: 2009-09-11 03:35 @191
por explorer
... que es el error típico de que Gtk2::ComboBox no está instalado en el sistema.

Re: Cómo coger datos de un combobox

NotaPublicado: 2009-09-12 05:42 @279
por oihantze
¿Y cómo se puede instalar?

Re: Cómo coger datos de un combobox

NotaPublicado: 2009-09-12 07:18 @346
por explorer
Perdón, he metido la pata... :(

Los módulos Gtk2 no se instalan por separado: están todos reunidos en una sola librería.

Pues el caso es que no sé porqué te sale ese mensaje. Se supone entonces que con el primer 'use Gtk2' debería valer.

Te he dejado un ejemplo que a mí sí que me funciona:

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. my @valores = 11 .. 20;
  10.  
  11.         ## Titular
  12.         my $frase = Gtk2::Label->new('Indique cuántos documentos desea buscar');
  13.  
  14.             ## Lista de opciones
  15.             my $comboBox = Gtk2::ComboBox->new_text();
  16.             for (@valores) {
  17.                 $comboBox->append_text($_);
  18.             }
  19.             $comboBox->set_active (0);
  20.  
  21.         ## Tabla de la lista
  22.         my $tabla_combo= Gtk2::Table->new(2,3,TRUE);
  23.         $tabla_combo->attach_defaults($comboBox, 1,2,1,2);
  24.  
  25.             ## Botón Atrás
  26.             my $boton_atras = Gtk2::Button->new_with_label('Atras');
  27.             $boton_atras->signal_connect(clicked => \&atras);
  28.  
  29.             ## Botón Ok
  30.             my $boton_ok = Gtk2::Button->new_from_stock('gtk-ok');
  31.             $boton_ok->signal_connect(clicked => \&ir_a);
  32.  
  33.         ## Tabla de los botones
  34.         my $tabla_botones = Gtk2::Table->new(3,5, TRUE);
  35.         $tabla_botones->attach_defaults($boton_atras, 1,2,1,2);
  36.         $tabla_botones->attach_defaults($boton_ok, 3,4,1,2);
  37.  
  38.     ## Tabla contenedor
  39.     my $tabla_contenedor = Gtk2::Table->new(3,7, FALSE);
  40.     $tabla_contenedor->attach_defaults($frase, 1,2,1,2);
  41.     $tabla_contenedor->attach_defaults($tabla_combo, 1,2,3,4);
  42.     $tabla_contenedor->attach_defaults($tabla_botones, 1,2,5,6);
  43.  
  44.  
  45. ## Ventana principal
  46. my $ventana = Gtk2::Window->new('toplevel');
  47. $ventana->set_title('Documentos');
  48. $ventana->set_border_width(20); # 20px
  49.  
  50.         ## Estilo
  51.         my $rc_style = Gtk2::RcStyle->new;
  52.         $rc_style->bg_pixmap_name('normal', 'fondo.jpg');
  53.  
  54. $ventana->modify_style($rc_style);
  55. $ventana->signal_connect (delete_event => sub {Gtk2->main_quit; TRUE}); # Cierre de la app
  56. $ventana->add($tabla_contenedor);
  57. $ventana->set_default_size(200,200);
  58. $ventana->set_keep_above(TRUE);
  59. $ventana->set_resizable(FALSE);
  60. $ventana->move(380, 300);
  61. $ventana->show_all;
  62.  
  63. Gtk2->main;
  64.  
  65. sub ir_a {
  66.     print 'Índice: ', $comboBox->get_active(),      "\n";
  67.     print 'Texto : ', $comboBox->get_active_text(), "\n";
  68. }
  69.  
  70. sub atras{
  71.     Gtk2->main_quit;
  72. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Es igual que el tuyo, salvo que el orden de creación de los componentes es por jerarquía de menos a más. Así quedan agrupadas las órdenes para un mismo componente (que es lo contraría de lo que haríamos si usáramos el método del pack()).

Presta atención a los trucos de agregar elementos al Combobox por medio del for(), que también es válido para listas de elementos.

He añadido también llamadas a Gtk2->main_quit() para terminar correctamente la aplicación, tanto al pulsar el botón 'Atrás' como cuando la ventana recibe la señal de cierre (puesto de dos formas distintas).

En cuanto a la lectura del Combobox, uso los métodos get_active() y get_active_text().