GTK, desarrollo de interfaces graficas (I)

24 07 2006 Articulos programación
    Este tutorial se basa en el que esta disponible en la pagina oficial de la GTK. Esta dedicado a la versión 2 de GTK+ que es la mas actual en el momento que escribo este mensaje (si lees esto después del 2010 no te olvides de actualizar tus conocimientos).

    Bueno para todos aquellos que nunca han programado en entorno gráfico les dedico el siguiente párrafo.

    Los sistemas gráficos están plagados de ventanas con botones, menús, imágenes, barras de scroll y demas objetos (en GTK todos estos elementos se llaman widgets -traduccion cacharro, atilugio. Si, utilizare el termino ingles o la termino objeto) que pueden ser activados/utilizados en cualquier momento. Para poder tratar estos elementos GTK (y otros sistemas para la creación de interfaces gráficas) utiliza un sistema basados en señales/eventos que llaman a funciones que son los que realizan el comportamiento asociado a cada objeto (widget).

    Basicamente una aplicacion grafica en GTK inizializa el sistema, crea cada uno de los objetos
que requiere la aplicacion (ventanas, botones, etc), asigna los eventos asociados a cada objeto, los muestra por pantalla y deja la aplicacion es estado de espera a la llegada de cada uno de esos eventos (tambien llamados señales aunque no tienen relacion alguna con el sistema de señales de Unix).

    Veamos un ejemplo sencillo


#include

static void hello( GtkWidget *widget, gpointer data )
{
g_print ("¡Hola mundo!\n");
}

static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data )
{
g_print ("Evento de borrado detectado\n");
return TRUE;
}

static void destroy(GtkWidget *widget, gpointer data)
{
gtk_main_quit ();
}

int main( int argc, char *argv[] )
{
GtkWidget *window;
GtkWidget *button;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL);

g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);

gtk_container_set_border_width (GTK_CONTAINER (window), 10);

button = gtk_button_new_with_label ("Hello World");

g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (hello), NULL);

g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (window));

gtk_container_add (GTK_CONTAINER (window), button);

gtk_widget_show (button);

gtk_widget_show (window);

gtk_main ();

return 0;
}


    Para compilarlo en linux con gcc instalado ejecuta esto en una shell. Debes tener instaladas las librerias GTK+-2.0

# gcc hello_world.c `pkg-config --cflags --libs gtk+-2.0`

    Con el sistema X en ejecucion puedes ver tu aplicacion ejecutando:

#./a.out

    pkg-config es una herramienta que sirve para localizar los directorios donde estan situados las librerias y los archivos necesarios para la compilacion.

    El programa define 4 funciones, 3 de ellas hello, delete_event y destroy son las funciones que se llamaran cuando se dispare un evento dentro de nuestra ventana. Main es la cuarta funcion. Dentro de ella se crean los objetos (ventana y boton), se inicializa el sistema (con gtk_init). GtkWidget declara las variables como objetos (widgets). gtk_window_new y gtk_button_new_with_label crean la ventana y el boton respectivamente.

    Las funciones g_signal_connect y g_signal_connect_swapped registran cada uno de los eventos que deseemos implementar e informan de cual es la funcion que se ejecutara en cada caso.

    Ademas debemos incluir el boton dentro de la ventana con:


gtk_container_add (GTK_CONTAINER (window), button);



    Finalmente se muestra los objetos utilizando gtk_widget_show


gtk_widget_show (button);

gtk_widget_show (window);


    La aplicacion queda a la espera de los eventos con la linea

gtk_main ();


    Las señales que se registran son las siguientes

g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL);


delete_event (ventana) -- Se dispara cuando intentamos cerrar la ventana utilizando los controles que estan en la barra de titulo de la ventana (o el botón x de la esquina derecha o en el menú la opción cerrar). En nuestro programa se ejecuta la función "delete_event" que simplemente imprime en consola "Evento de borrado detectado". En la función delete_event el return TRUE; informa que el evento no precisa llamar a otras funciones para completar su funcionalidad.

    El sistema GTK tiene una implementación por defecto para cada una de las señales/eventos que detecta. Si deseamos que ejecute su implementación por defecto tenemos que o bien no registrar en nuestro programa la señal o si lo hacemos debemos hacer que la función asignada a la señal devuelva TRUE para indicar que no deseamos ejecutar la implementación por defecto. FALSE en caso contrario.

destroy (ventana) -- Se llama cuando se destruye el objeto, en nuestro caso la ventana. La función asociada ejecuta simplemente un:

gtk_main_quit ();


    que termina la ejecucion de espera de gtk_main ();

    clicked (botón) -- Se ejecuta cuando se hace clic sobre el botón (obviamente) llama a la function hello que imprime el mensaje hola mundo por consola y ademas llama a la función gtk_widget_destroy de la ventana y no del boton, por eso utilizamos la funcion g_signal_connect_swapped en lugar de g_signal_connect ya que el objeto sobre el que actua el evento no es el mismo que el que lo recibe.

    La función gtk_widget_destroy destruye el objeto ventana y emite la señal "destroy" que llama a nuestra función destroy que a su vez llama a gtk_main_quit (); que termina la ejecución del gtk_main(); en la función main.

    Bueno a partir de aquí y con alguna documentacion de referencia sobre los objetos y los eventos que tenemos a nuestra disposición ya podemos empezar a crear nuestras propias pequeñas aplicaciones.

    Animo y en breve seguire con la saga...

Bookmark GTK, desarrollo de interfaces graficas (I)  at del.icio.us Digg GTK, desarrollo de interfaces graficas (I) Mixx GTK, desarrollo de interfaces graficas (I) Bloglines GTK, desarrollo de interfaces graficas (I) Technorati GTK, desarrollo de interfaces graficas (I) Fark this: GTK, desarrollo de interfaces graficas (I) Bookmark GTK, desarrollo de interfaces graficas (I)  at YahooMyWeb Bookmark GTK, desarrollo de interfaces graficas (I)  at Furl.net Bookmark GTK, desarrollo de interfaces graficas (I)  at reddit.com Bookmark GTK, desarrollo de interfaces graficas (I)  at blinklist.com Bookmark GTK, desarrollo de interfaces graficas (I)  at Spurl.net Bookmark GTK, desarrollo de interfaces graficas (I)  at NewsVine Bookmark GTK, desarrollo de interfaces graficas (I)  at Simpy.com Bookmark GTK, desarrollo de interfaces graficas (I)  at blogmarks Bookmark GTK, desarrollo de interfaces graficas (I)  with wists Bookmark GTK, desarrollo de interfaces graficas (I)  at Ma.gnolia.com wong it! Bookmark using any bookmark manager! Stumble It!

Referencias


No hay referencias

Comentarios

Mostrar comentarios como (Plano | Hilos)
14 09 2008
#1 niko (Responder)

donde encuentro el gtk+-2.0, soy novato ayudame por favor
25 09 2008
#1.1 Abraham Covelo (Responder)

Hola niko,

Aquí puedes descargártelo:

http://www.gtk.org/download.html

Añadir comentario


Encerrando entre asteriscos convierte el texto en negrita (*palabra*), el subrayado es hecho así: _palabra_.
Smilies normales como :-) y ;-) son convertidos en imágenes.