Aplicaciones GTK+ con C


Desarrollemos nuestra primer ventana en GTK+ con C de forma practica:

El archivo gtk.h incluye todos los widgets, variables, estructuras y funciones de GTK+.

En el siguiente fragmento de código, lo que hacemos es declarar nuestra ventana e inicializar las librerías de GTK+.

GtkWidget *ventana;
gtk_init (&argc, &argv);

En el siguiente fragmento, creamos la ventana que declaramos y le asignamos el titulo, pero aun no se puede mostrar hasta llamar a la función gtk_widget_show. GTK+ esta escrito en C, pero tiene ciertos rasgos como de un lenguaje orientado a objetos, observa la función gtk_window_new.

ventana = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (ventana), "Hola GTK+");
gtk_widget_show (ventana);

La ultima función es gtk_main(), es la que se encarga de tomar todos los procesos y eventos que se generen en la ejecución de nuestra aplicaciaquón.

gtk_main ();

Ejemplos 1: Creación de la ventana

#include <gtk/gtk.h>

int main (int argc, char *argv[])
{
    /* Declaramos nuestra ventana */
    GtkWidget *ventana;

    /* Inicializamos las librerías GTK+ y demás */
    gtk_init (&argc, &argv);

    /* Creamos y mostramos nuestra ventana */
    ventana = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (ventana), "Hola GTK+");
    gtk_widget_show (ventana);

    gtk_main ();

    return 0;
}

Ahora compilemos nuestro código y ejecutemos el programa:

$ gcc -Wall -g HolaGTK.c -o HolaGTK `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`
$ ./HolaGTK

Ejemplos 2: Creación de la ventana con evento

Con este ejemplo vamos a crear nuevamente una ventana, pero ahora asignaremos el evento destroy que nos permite su correcto funcionamiento para finalizar la aplicación.

#include <gtk/gtk.h>

static void destroy (GtkWidget*, gpointer);
static gboolean destroy_event (GtkWidget*, GdkEvent*, gpointer);

int main (int argc, char *argv[])
{
	/* Declaramos nuestra ventana */
	GtkWidget *ventana, *etiqueta;

	/* Inicializamos las librerías GTK+ y demás */
	gtk_init (&argc, &argv);

	/* Creamos nuestra ventana */
	ventana = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	gtk_widget_set_size_request (ventana, 200, 200);

	/* Ligar la ventana con el evento "destroy" */
	g_signal_connect (G_OBJECT (ventana), "destroy", G_CALLBACK (destroy), NULL);
	g_signal_connect (G_OBJECT (ventana), "destroy_event", G_CALLBACK (destroy_event), NULL);

	/* Creamos un GtkLabel */
	etiqueta = gtk_label_new ("Hola GTK+");
	gtk_label_set_selectable (GTK_LABEL (etiqueta), TRUE);
	gtk_container_add (GTK_CONTAINER (ventana), etiqueta);

	/* Mostramos la ventana */
	gtk_window_set_title (GTK_WINDOW (ventana), "GTK+ con C");
	gtk_widget_show_all (ventana);

	gtk_main ();

	return 0;
}

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

static gboolean destroy_event (GtkWidget *window, GdkEvent *event, gpointer data)
{
	return FALSE;
}

Este ejemplo es un poco más complicado ya que debemos implementar un método con su evento para finalizar correctamente nuestro programa. Así como también se han sustituido algunas funciones, como:

/* Con esta función mostramos una simple ventana */
gtk_widget_show(ventana);

/* Pero cuando agregamos algunos Widget será necesaria la función */
gtk_widget_show_all (ventana);

Posted in

5 responses to “Aplicaciones GTK+ con C”

  1. Miguel
    Posted June 10, 2011 at 7:42 pm | Permalink

    Hola Albert, estoy desesperado con el tema del GTK+, no consigo compilar ni a tiros.

    Al lanzar el comando “gcc” que pones arriba me dice:

    “Package pangocairo was not found in the pkg-config search path.”

    He buscado en internet, parece que es bastante comun este error y para mas inri este paquete no está en los repositorios; creo que hay un bug general aqui como una casa.

    1. Posted June 10, 2011 at 11:53 pm | Permalink

      Que tal Miguel

      Revisa que tengas las librerías de desarrollo de Gtk adecuadas, yo te recomiendo que instales todas las librerías más actuales.

      En caso de que no se corrija el problema me escribes para revisarlo más a fondo.

  2. Miguel
    Posted June 15, 2011 at 7:44 pm | Permalink

    Nada, imposible L.Alberto.
    He revisado en el Synaptic todo lo que empieza y tiene “dev” por “libgtk*****” instalando algunas que faltaban, todo los pango, cairo, y algunas mas que vienen en la pagina oficial de GTK pero me sigue diciendo los mismo:

    Package pangocairo was not found in the pkg-config search path.
    Perhaps you should add the directory containing `pangocairo.pc’

    y es que no tengo ni rastro de ese “pangocairo.pc”. No está en mi sistema.

    E intentar compilar desde cero todo el paquete es para mi imposible porque no resuelvo jamas las dependencias; siempre falta algo que a su vez lo instalas pero te pide otra y otra hasta que me aburro.

    En fin si se te ocurre alguna pista bienvenida sea.

    Un “uname -a” me devuelve esto por si te sirve de algo:

    Linux debian 2.6.26-2-686 #1 SMP Thu Jan 27 00:28:05 UTC 2011 i686 GNU/Linux

    Saludos.

  3. Miguel
    Posted June 15, 2011 at 7:49 pm | Permalink

    P.D: En un portatil que tengo con Ubuntu 11.04 ma pasa exactamente lo mismo y está totalmente actualizado igual que el Debian.

    ???

    Saludos otra vez.

  4. Miguel
    Posted October 8, 2011 at 9:22 pm | Permalink

    Hola L.Alberto.

    He vuelto a retomar este tema despues de una buena actualizacion a la 2.6.32. Intenté compilar de entrada tu ejemplo de la web pero daba errores pero ya distintos de los mencionados arriba; la cosa es que ahora SI tengo todo lo necesario pero descolocado, es decir, esta linea:

    gcc -Wall -g HolaGTK.c -o HolaGTK `pkg-config –cflags gtk+-2.0` `pkg-config –libs gtk+-2.0′

    no funcionaba porque va a buscar los “.h” a /usr/local/… y alli no están; pero quitando ese “/local” ha compilado a la primera.

    Me hace mucha ilusión porque tenía muchas ganas de meterle mano a este tema.

    Gracias una vez mas.

Leave a Reply