Creando interfaces gráficas con Gtk2-Perl


En este artículo veremos una pequeña introducción a la creación de GUIs a través del módulo Gtk2 de perl. Este módulo nos permitirá crear interfaces gráficas, de aspecto bastante profesional, de una manera rápida y fácil.

Índice

  • Hello World!
  • Eventos y Callbacks(1)
  • Posicionando los widgets(1)
  • Ventanas(2)
  • Principales widgets(3)
  • Button(3)
  • Frames(3)
  • Labels(3)
  • Tooltips(3)
  • Checkbuttons(3)
  • RadioButtons(4)
  • TextEntry(4)
  • TextView(4)
  • Menus(5)
  • Referencias(5)
  • Con el módulo Gtk2, podemos crear GUIs de manera rápida y fácil,
    para programas pequeños y medianos.
    En primer lugar, necesitamos tener instalados los módulos Glib y Gtk2.
    En debian es el paquete libgtk2-perl. Para las otras distribuciones podeis
    bajar los 2 módulos del CPAN(6) o directamente
    desde la línea de comandos con perl -MCPAN -e shell (install Glib
    y install Gtk2).

    Veremos una pequeña introducción a Gtk2 a través de Perl.
    Solamente trataré los signals (producidos por eventos), callbacks, posicionamiento
    de widgets, ventanas, los 7 widgets principales, menues y poco mas.
    Para los otros 35 widgets, man es vuestro amigo :-).

    1.- Hello World!
    Para no romper con la tradición, empezamos con el típico Hello World!

    #!/usr/bin/perl -w

    use Gtk2 ‘-init’;

    $ventana = Gtk2::Window->new(‘toplevel’);
    $ventana->set_title(‘Hello World!’);
    $ventana->set_border_width(20);
    $boton = Gtk2::Button->new(‘Hello World!’);
    $boton->signal_connect(‘clicked’ => sub {Gtk2->main_quit; });
    $ventana->add($boton);
    $ventana->show_all;

    # Empieza el show…
    Gtk2->main;

    Bien, casi no necesita comentarios :-). La linea use Gtk2 ‘-init’ carga el toolkit
    Gtk2 y lo inicializa. Sobra decir, que esta linea deberá estar presente en todos los programas 🙂
    Con la llamada al constructor (‘new’) creamos una nueva instancia del objeto Window.
    El escalar $ventana contiene una referencia al widget que acabamos de crear.

    A continuación, establecemos el título de la ventana y ponemos un borde de 20px a la ventana.
    Creamos un botón con el texto especificado y ahora llega lo importante. Asociamos la pulsación
    del boton (el evento ‘clicked’ ) a una subrutina (estrictamente, es una referencia a una subrutina).
    En el caso del ejemplo, estamos haciendo referencia a una subrutina anónima.
    Finalmente, con el método add añadimos el botón a la ventana creada anteriormente.
    Le decimos a la ventana que muestre todos los widgets que contiene y entramos en el bucle principal.
    A partir de aquí, el programa permanece a la espera que se produzca algún evento.

    Muchas de las funciones de Gtk2 reciben como argumentos TRUE o FALSE. Si en vez de ir
    poniendo 1 y 0, quereis usar TRUE y FALSE, teneis que exportar las constantes TRUE y
    FALSE del módulo Glib al inicio de vuestros scripts.
    Esto es: use Glib qw/TRUE FALSE/;

    2.- Eventos y Callbacks

    Gtk es un toolkit orientado a eventos. Al llamar a Gtk2->main ,el programa entra en un
    bucle infinito y permanece a la espera de eventos.
    Eventos hay de muchos tipos. Un evento puede ser la pulsación de un botón por el
    usuario, la entrada de texto, la destrucción de un widget, etc.
    Cada widget tiene sus propios eventos o signals. Prácticamente todos los widgets
    generan alguna señal, incluso el Label.

    Para que el programa haga algo, será necesario asociar los eventos a callbacks
    (funciones que realizaran algo en función del evento que se haya producido).
    Todos los widgets tienen el método “signal_connect” que nos permitirá asociar un evento
    a un callback.
    $widget->signal_connect(evento => \&callback);

    Asociar el click de un botón a un callback, es tan simple como:
    $boton->signal_connect(clicked => \&haz_algo);

    El callback no es mas que una referencia a una función (\&nombre_funcion).

    sub haz_algo {
    my ($widget, @argumentos) = @_;
    ….
    }

    $widget contiene una referencia al widget que ha generado el evento.
    Obviamente, se pueden pasar argumentos a la función.

    $boton->signal_connect(clicked => \&haz_algo, ‘un_argumento’);
    El primer elemento del array @_ siempre será una referencia al widget
    que ha generado el evento. El resto de elementos del array @_ son los
    argumentos con los cuales se ha llamado a la función.

    Existe una jerarquia de widgets (con man Gtk2::index podeis ver un listado de todos
    los widgets). Los widgets inferiores heredan los signals de sus widgets padre.
    Comentar que con $widget->set(‘propiedad’ => valor) podemos cambiar qualquier
    propiedad de un widget (para ver las propiedades de un widget, man Gtk2::Widget).
    Por ejemplo:
    $label->set(‘label’ => ‘Nuevo texto del Label’);

    Cambiamos la propiedad ‘label’ (es el texto que muestra el Label) del widget $label.

    3.- Posicionando los widgets

    En el toolkit Gtk2, existen dos métodos para posicionar los widgets dentro un widget
    contenedor (como ejemplos de Widgets contenedores podemos citar Gtk2::Window,
    Gtk2::VBox, Gtk2::HBox… pero hay muchos mas, incluso un botón puede ser un contenedor ).

    El primer método consiste en usar los widgets HBox (es una caja horizontal
    transparente) y VBox (la correspondiente caja vertical transparente).
    En la caja horizontal, por defecto, los widgets se insertan de izquierda a derecha.
    En la caja vertical, por defecto, los widgets se insertan de arriba a abajo.

    # El argumento homegeneidad (booleano) controla si los widgets que
    # contenga la caja tendran el mismo tamaño. El segundo argumento es
    # el espacio añadido entre los objetos.
    $caja = Gtk2::HBox->new( $homegeneidad, $spacing);
    $caja_vertical = Gtk2::VBox->new($homegeneidad, $spacing);

    # Añadimos dos botones a nuestra caja horizontal( $expand es en valor booleano que
    # determina si el widget se expendirá para ocupar toda la celda(TRUE) o será la celda
    # quien se adaptará al tamaño del widget(FALSE), $fill debe ser un valor booleano que
    # depende de $expand. Determina como se realiza la expansión (aumentando el widget de
    # tamaño o no).

    $caja->pack_start($boton1, $expand, $fill, $padding);
    $caja->pack_start($boton2, $expand, $fill, $padding);

    # Si lo queremos añadir al revés usaremos pack_end
    # Finalmente, añadimos la caja a nuestra ventana principal
    # Es necesario llamar al método show($widget) o show_all para que se
    # nos muestren los widgets.
    $ventana->add($caja);
    $ventana->show_all;

    Este post ha sido traido de forma automatica desde https://web.archive.org/web/20140625063149/http:/bulma.net/body.phtml?nIdNoticia=2082 por un robot nigromante, si crees que puede mejorarse, por favor, contactanos.


    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.