Diseño de interfaces gráficas con GTK

written by uve 21 March 2011

Aprovechando las prácticas de una de mis asignaturas, Informática Gráfica, voy a escribir unos artículos relacionados con interfaces gráficas, más concretamente GTK y algo más adelante, GTK y OpenGL. Como lenguaje de programación voy a utilizar C (la otra alternativa era Java, es decir, impuesto por la asignatura) y como sistema operativo utilizaré Ubuntu 10.10.

En este primer artículo vamos a ver qué necesitamos tener instalado, como crear una simple ventana y como compilar esto. Asumo que ya has programado alguna vez en C (y/o C++) y que build-essential lo tienes instalado.

Código fuente

Para instalar los ficheros necesarios para compilar con GTK, puedes ejecutar lo siguiente:

$ sudo apt-get install libgtk2.0-dev

Una vez instalados los paquetes necesarios para poder compilar, vamos a ver el código de este primer ejemplo:

#include <gtk/gtk.h>
#include <stdlib.h>

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

    // Inicializamos de GTK
    gtk_init(&argc, &argv);

    // Creamos de la interfaz gráfica
    ventanaPrincipal = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Se crea la ventana principal
    gtk_window_set_default_size(GTK_WINDOW(ventanaPrincipal), 400, 300); // Se establecen sus dimensiones
    gtk_window_set_title(GTK_WINDOW(ventanaPrincipal), "Primer ejemplo GTK - Menudo Problema"); // Se pone el título
    gtk_window_set_position(GTK_WINDOW(ventanaPrincipal), GTK_WIN_POS_CENTER_ALWAYS); // La queremos centrada

    // Conectamos las señales, es decir, en este paso indicamos que funciones
    // queremos que se ejecuten cuando ocurra una señal. En este caso, sólo
    // vamos a atender a la señal "destroy" de la ventana principal y vamos a
    // ejecutar la función "gtk_main_quit". De esta forma, cuando se pulse [X] en
    // la ventana, se ejecutará la función "gtk_main_quit" que se encargará de
    // terminar la aplicación.
    gtk_signal_connect(GTK_OBJECT(ventanaPrincipal), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    // Se hace visible la ventana
    gtk_widget_show_all(ventanaPrincipal);

    // Se inicia el bucle principal de GTK. Aquí se atenderán todas las señales
    // y todas las peticiones que se realicen a través de la interfaz. Así, si
    // un usuario hace click en un botón o pulsa una tecla, GTK atiende la
    // petición por nosotros.
    gtk_main();

    return EXIT_SUCCESS;
}

He intentado que el código esté bien documentado, y creo que no hay nada más que añadir, así que ahora toca compilar. Para ello vamos a hacer uso de pkg-config, el cual nos dará todas las flags que necesitamos para compilar:

$ pkg-config --libs --cflags gtk+-2.0
-pthread -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0
-I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0
-I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
-I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12
-pthread -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0
-lpangocairo-1.0 -lgdk_pixbuf-2.0 -lm -lcairo -lpng12 -lpango-1.0 -lfreetype
-lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0

Así que, para compilar basta con lo siguiente:

$ gcc main.c -o main -Wall `pkg-config --libs --cflags gtk+-2.0`

Tags

La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.