[LinuxFocus-icon]
Hogar  |  Mapa  |  Indice  |  Busqueda

Noticias | Arca | Enlaces | Sobre LF
Este documento está disponible en los siguientes idiomas: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Nederlands  Russian  Turkce  Polish  

convert to palmConvert to GutenPalm
or to PalmDoc

Ozcan Gungor
por Özcan Güngör
<ozcangungor%28at%29netscape.net>

Sobre el autor:
Utilizo Linux desde 1997. Libertad, flexibilidad y opensource. Son las características que me gustan.

Taducido al español por:
Luis F. Díaz <luisfdd(at)yahoo.es>

Contenidos:

 

Programar GUI con GTK

GTK

Resumen:

En esta serie de artículos aprenderemos cómo escribir programas con interfaz de usuario gráfica (GUI) utilizando GTK. No tengo ni idea de cuando concluirán. Para entenderlos deberías saber manejar los siguientes conceptos del lenguaje de programación C:

  • Variables
  • Funciones
  • Punteros


_________________ _________________ _________________

 

¿Qué es GTK?

GTK (GIMP Toolkit) es una biblioteca que posibilita la creación de interfaces de usuario gráficas (Graphical User Interfaces, GUI). Está disponible bajo licencia GPL. Utilizando dicha biblioteca pueden crearse programas de código abierto, tanto libres como comerciales.

La biblioteca se denomina GIMP toolkit (GTK) por haber sido creada para desarrollar el GIMP (General Image Manipulation Program). Sus autores son:

GTK es un interfaz de aplicaciones de usuario orientado a objetos. Aunque escrita en C, utiliza clases y llamada a funciones.

 

Compilación

Para compilar programas GTK se necesita decirle a gcc qué bibliotecas GTK necesita y dónde están. La orden gtk-config lo sabe:

# gtk-config --cflags --libs

La salida debería ser, dependiendo del sistema, algo así como:

-I/opt/gnome/include/gtk-1.2 -I/opt/gnome/include/glib-1.2 -I/opt/gnome/lib/glib /include -I/usr/X11R6/include -L/opt/gnome/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -l Xext -lX11 -lm

El significado de los parámetros anteriores es el siguiente:

-l library: Busca una biblioteca según el formato liblibrary.a en la ruta especificada.
-L path: Añade una ruta de búsqueda de biliotecas.
-I path: Añade una ruta para encontrar un archivo de cabecera utilizado en el programa.

Para compilar un programa GTK llamado hello.c se puede utilizar la siguiente orden:

gcc -o hello hello.c `gtk-config --cflags --libs`

La entrada que aparece detrás del parámetro -o es el nombre del programa compilado.

 

Un programa inicial

Se supone que tu sistema tiene instalado GTK. Las últimas versiones pueden encontrarse en ftp.gtk.org.

Vamos a escribir nuestro primer programa. Dicho código crea una ventana vací�a de 200x200 pixels de tamaño:

#include <gtk/gtk.h>

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

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);

gtk_main ();

return(0);
}

GtkWidget es un tipo de variable para definir varios componentes como window (ventana), button (botón), label (etiqueta)... En este ejemplo, una ventana se define así:

GtkWidget *window;

void gtk_init(int *argc,char ***argv) inicia el GTK y obtiene sus parámetros introducidos en la lí�nea de comandos. Dicha función debe usarse después de definir componentes.

GtkWidget *gtk_window_new(GtkWindowType windowtype) crea una ventana nueva. Una ventana puede ser de cualquiera de los siguientes tipos:

void gtk_widget_show(GtkWidget *widget) se utiliza para hacer aparecer un componente en una ventana. Esta función se usa después de haber definido el componente y cambiado sus atributos.

void gtk_main(void) prepara la ventana y sus componentes para aparecer en pantalla. Dicha función debe usarse al final de un programa GTK.

Veamos ahora algunas propiedades de la ventana, como el título, el tamaño, la posición...

void gtk_window_set_title(GtkWindow *window,const gchar *title)

se utiliza para poner o cambiar el título de un componente window. El primer parámetro en dicha función es de tipo GtkWindow, pero la variable window es de tipo GtkWidget. Seremos advertidos durante la compilación y, aunque el programa compilado funcione, es mejor corregirlo. Para eso se utiliza GTK_WINDOW(GtkWidget *widget). El segundo parámetro, title , es de tipo gchar. gchar está definido de la misma forma que un tipo char en la biblioteca glib.

void gtk_window_set_default_size(GtkWindow *window, gint width, gint height)

dispone el tamaño de la ventana. Como gchar, gint está definido de la misma forma que int en la biblioteca glib.

La función

void gtk_window_set_position(GtkWindow *window, GtkWindowPosition position)

fija la posición de la ventana. position puede ser:

He aquí un ejemplo:

#include <gtk/gtk.h>

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

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"Ýlk Program");
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window),300,300);
gtk_widget_show (window);

gtk_main ();

return(0);
}
 

Señales y Eventos

En GUIs se necesita usar ratón y teclado, es decir, se puede apretar en un botón. Por eso se usa la función GTK siguiente:

guint gtk_signal_connect_object(GtkObject *object,const gchar *name,GtkSignalFu nc func,GtkObject *slot_object);

object es el componente que emite las señales. Por ejemplo, si quieres saber si un botón ha sido pulsado, object será button. name es el nombre del evento, que puede ser cualquiera de los siguientes:

func es la función que debe ser llamada cuando ocurra un envento. He aquí un ejemplo:

#include <gtk/gtk.h>

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

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

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC (close), NULL);
gtk_widget_show (window);

gtk_main ();

return(0);
}

La función

gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (close), NULL)

escucha el evento de destrucción de la ventana. Cuando la ventana es obligada a cerrarse, se llama a la función close. La función close llama a gtk_main_quit() y el programa finaliza.

Los detalles sobre señales y eventos serán explicados más adelante...

 

Un botón ordinario

Los botones usuales normalmente hacen algo cuando son pulsados. En la biblioteca GTK hay dos formas de crear un botón:

  1. GtkWidget* gtk_button_new (void);
  2. GtkWidget* gtk_button_new_with_label (const gchar *label);

La primera función crea un botón sin etiqueta (no lleva nada escrito). La segunda, crea un botón con etiqueta (label es la etiqueta escrita sobre el botón).

Ahora vamos a utilizar una función nueva:

void gtk_container_add(GtkContainer *container,GtkWidget *widget)

Mediante dicha función es posible hacer que un botón (u otro componente) aparezca en una ventana (o en cualquier otro contenedor). En el siguiente ejemplo, el contenedor es una ventana y el componente que se añade un botón. Aprenderemos sobre otro tipo de contenedores más adelante.

Lo más importante de un botón es saber si se pulsa o no. De nuevo se utiliza la función gtk_signal_connect para saberlo. Mediante ella se llama a otra, que es la que realmente se "esconde" en el botón. He aquí un ejemplo:

#include <gtk/gtk.h>

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

void clicked(GtkWidget *widget,gpointer *data)
{
g_print("Button Clicked\n");
}
int main( int argc,char *argv[] )
{
GtkWidget *window,*button;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC (close), NULL);

button=gtk_button_new_with_label("Button");
gtk_container_add(GTK_CONTAINER(window),button);
gtk_signal_connect(GTK_OBJECT(button),"clicked",
GTK_SIGNAL_FUNC(clicked),NULL);
gtk_widget_show(button);

gtk_widget_show(window);

gtk_main ();

return(0);
}



 

Formulario de "talkback" para este artículo

Cada artículo tiene su propia página de "talkback". A través de esa página puedes enviar un comentario o consultar los comentarios de otros lectores
 Ir a la página de "talkback" 

Contactar con el equipo de LinuFocus
© Özcan Güngör, FDL
LinuxFocus.org
Información sobre la traducción:
tr --> -- : Özcan Güngör <ozcangungor%28at%29netscape.net>
tr --> en: Özcan Güngör <ozcangungor%28at%29netscape.net>
en --> es: Luis F. Díaz <luisfdd(at)yahoo.es>

2003-05-13, generated by lfparser version 2.34