• Publicidad

Script para XChat con Gtk y Glade

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

Script para XChat con Gtk y Glade

Notapor LeoSevilla » 2014-02-01 15:52 @703

Hola, quiero hacer un script para Xchat usando Gtk y Glade. El problema es que llego a mostrar la ventana, pero cuando la cierro, esta me cierra también el Xchat.

Aquí la interfaz gráfica:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <glade-interface>
  3.   <!-- interface-requires gtk+ 2.24 -->
  4.   <!-- interface-naming-policy project-wide -->
  5.   <widget class="GtkWindow" id="ventana">
  6.     <property name="can_focus">False</property>
  7.     <child>
  8.       <widget class="GtkButton" id="boton">
  9.         <property name="label" translatable="yes">button</property>
  10.         <property name="visible">True</property>
  11.         <property name="can_focus">True</property>
  12.         <property name="receives_default">True</property>
  13.         <property name="use_action_appearance">False</property>
  14.         <signal name="clicked" handler="salir" swapped="no"/>
  15.       </widget>
  16.     </child>
  17.   </widget>
  18. </glade-interface>
  19.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El código perl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use Gtk2 -init;
  6. use Gtk2::GladeXML;
  7.  
  8. Xchat::register( "Prog" , "0.1" , "Test" );
  9. Xchat::print( "Loading script..\n" );
  10. Xchat::hook_command( "cmd" , "win" );
  11.  
  12. sub win{
  13.     my($programa, $ventana_principal, $boton_cerrar);
  14.     $programa = Gtk2::GladeXML->new('glade.glade');
  15.     $ventana_principal = $programa->get_widget('ventana');
  16.     $boton_cerrar = $programa->get_widget('boton');
  17.     $ventana_principal->show_all();
  18.     $boton_cerrar->signal_connect(clicked => \&salir);
  19.     Gtk2->main;
  20.     return Xchat::EAT_XCHAT;
  21. }
  22.  
  23. sub salir {Gtk2->main_quit;}
  24.  
  25. Xchat::print( "\0033Cargado con exito!\003\n" );
  26.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Al cargarlo, mando el comando /cmd y se abre la ventana, pero para cerrar hay que pulsar dos veces sobre el botón (primer problema) y cuando se cierra, me cierra también el Xchat (el segundo).

Saludos, LeoSevilla.
LeoSevilla
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2011-11-19 15:24 @683

Publicidad

Re: Script para XChat con Gtk y Glade

Notapor explorer » 2014-02-01 18:12 @800

Yo creo que hay algunas cosas que sobran, y otras que están colocadas en otro sitio.

Quiero decir que yo haría lo siguiente:
  • cuando arranque el script, sé que se produce una vez, inmediatamente después de arrancar XChat. Entonces, lo que voy a hacer en ese momento es crear la estructura de la ventana, ya que solo necesito hacerlo una vez
  • luego, cuando se invoca el comando, lo que hago es mostrar la ventana
  • si el usuario pulsa el botón de cierre o quiere cerrar la ventana, lo que hago es cerrarla, pero no cierro la aplicación
Sería algo así (no probado)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Gtk2 -init;
  5. use Gtk2::GladeXML;
  6.  
  7. Xchat::register( "Prog" , "0.1" , "Test" );
  8. Xchat::print( "Loading script..\n" );
  9. Xchat::hook_command( "cmd" , "win" );
  10.  
  11. # creación de la aplicación
  12. my $programa          = Gtk2::GladeXML->new('glade.glade');
  13. my $ventana_principal = $programa->get_widget('ventana');
  14.  
  15. # eventos
  16. $ventana_principal->signal_connect (destroy => sub { close_event($ventana_principal) } );
  17.  
  18. # mostrar la ventana
  19. sub win{
  20.     $ventana_principal->show_all();
  21.     return Xchat::EAT_XCHAT;
  22. }
  23.  
  24. Xchat::print( "\0033Cargado con exito!\003\n" );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Me he basado en lo que he visto en otros scripts XChat, como por ejemplo el LogViewer.

Fíjate que capturamos el evento de cierre de la ventana (el botón de cerrar en la barra de título de la ventana) y le decimos a la aplicación, no que cierre la aplicación, sino que cierre la ventana. Cuando el usuario vuelva a ejecutar el comando, debería volver a aparecer.

También, no está la llamada Gtk2->main, porque realmente ya estamos dentro de una aplicación Gtk2 (el XChat). Y esa es la causa de que cerrabas la aplicación al pulsar salir: había un Gtk2->main_quit, con lo que le estabas diciendo a XChat que se cerrara.
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: Script para XChat con Gtk y Glade

Notapor LeoSevilla » 2014-02-01 19:53 @870

Muchas gracias.

Vi el código del xchat_logviewer y también por tus explicaciones pude que funcionara.

Comentar que probé tu código y funcionó pero con algunos errores, y en cuanto a la estructura de la ventana hay que cargarla cada vez que se ejecuta el comando, porque sino solo aparece bien la primera vez que se ejecuta el comando /cmd, las siguientes solo aparece una ventana básica sin el botón. Hice varias pruebas y pego el código que funciona ahora siempre, y aclarar que para probarlo hay que meter el xml en la carpeta raíz del Xchat, lo digo porque yo tengo los scripts en un subdirectorio de éste para que no se carguen en el inicio del Xchat.


archivo glade.glade
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <glade-interface>
  3.   <!-- interface-requires gtk+ 2.24 -->
  4.   <!-- interface-naming-policy project-wide -->
  5.   <widget class="GtkWindow" id="ventana">
  6.     <property name="can_focus">False</property>
  7.     <child>
  8.       <widget class="GtkHBox" id="hbox1">
  9.         <property name="visible">True</property>
  10.         <property name="can_focus">False</property>
  11.         <child>
  12.           <widget class="GtkButton" id="boton">
  13.             <property name="label" translatable="yes">Salir</property>
  14.             <property name="visible">True</property>
  15.             <property name="can_focus">True</property>
  16.             <property name="receives_default">True</property>
  17.             <property name="use_action_appearance">False</property>
  18.           </widget>
  19.           <packing>
  20.             <property name="expand">True</property>
  21.             <property name="fill">True</property>
  22.             <property name="position">0</property>
  23.           </packing>
  24.         </child>
  25.         <child>
  26.           <widget class="GtkButton" id="boton2">
  27.             <property name="label" translatable="yes">Hola!</property>
  28.             <property name="visible">True</property>
  29.             <property name="can_focus">True</property>
  30.             <property name="receives_default">True</property>
  31.             <property name="use_action_appearance">False</property>
  32.           </widget>
  33.           <packing>
  34.             <property name="expand">True</property>
  35.             <property name="fill">True</property>
  36.             <property name="position">1</property>
  37.           </packing>
  38.         </child>
  39.       </widget>
  40.     </child>
  41.   </widget>
  42. </glade-interface>
  43.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y el código perl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Gtk2 -init;
  5. use Gtk2::GladeXML;
  6.  
  7. Xchat::register( "Prog" , "0.1" , "Test" );
  8. Xchat::print( "Loading script..\n" );
  9. Xchat::hook_command( "cmd" , "win" );
  10.  
  11. sub win{
  12.     my $programa = Gtk2::GladeXML->new('glade.glade');
  13.     my $ventana_principal = $programa->get_widget('ventana');
  14.     my $boton_cerrar = $programa->get_widget('boton');
  15.     my $boton_mostrar = $programa->get_widget('boton2');
  16.     $ventana_principal->signal_connect (destroy => sub { close_event($ventana_principal) } );
  17.     $boton_cerrar->signal_connect(clicked => sub { close_event($ventana_principal) } );
  18.     $boton_mostrar->signal_connect(clicked => \&hacer_algo);
  19.     $ventana_principal->show_all();
  20.     return Xchat::EAT_XCHAT;
  21. }
  22.  
  23. sub hacer_algo{
  24.   Xchat::print( "\0033Hola!!!\n" );
  25. }
  26.  
  27. sub close_event {
  28.         my ($w) = @_;
  29.         $w->destroy();
  30. }
  31.      
  32. Xchat::print( "\0033Cargado con exito!\003\n" );
  33.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sin más, de nuevo muchas gracias. Salu2 LeoSevilla
LeoSevilla
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2011-11-19 15:24 @683


Volver a Básico

¿Quién está conectado?

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