Sei sulla pagina 1di 63

Asociacin de usuarios de Software Libre de la UPV

Programacin grfica en entorno GNOME usando la biblioteca GTK+ 2.0

Parte I: Nivel Iniciacin


Domingo Gonzlez gonavv@gmail.com

Escritorios GNU/Linux

Escritorio GNOME

Biblioteca GTK+ Biblioteca Qt

Escritorio KDE

Problemtica diferentes desarrollos GUADEMY

Indice
1.- Programacin C en Linux. Particularidades. 2.- Bibliotecas bsicas en GNOME 3.- Biblioteca Glib: objetos y seales 4.- Biblioteca GTK+: widgets, seales, y contenedores 5.- Herramientas para desarrollo 6.- Bindings 7.- Ejemplos

Programacin C en Linux Resumen

Estructura de un programa
#include <ficheros_de_cabecera> ...declaracion de variables globales; ...declaracion de funciones int main (int argc, char* argv[]) { ...declaracion de variables locales; ...instruccion; }

Programacin C en Linux Compilacin (1)

Compilacin con gcc


$ gcc main.c -> a.out $ gcc -o holamundo main.c $ ./holamundo

Programacin C en Linux Compilacin (2)

Opciones del compilador


-o <file> nombre del ejecutable, por defecto a.out -Wall Muestra todos los warnings -g Incluye en el binario informacin de depuracin (para usar un depurador posteriormente). -l <library> Especifica el nombre de una librera adicional que deber ser utilizada en el proceso de enlazado

Bibliotecas bsicas Glib (1)

Biblioteca Glib: descripcin

Es una biblioteca de ayuda para la programacin en C. Proporciona:

Tipos de datos portables entre sistemas operativos y arquitecturas. glib ofrece tipos de datos propios que permiten programar sin tener en cuenta la diferencia de tamao entre arquitecturas. Gestin de memoria: ofrece funciones equivalentes a las funciones de asignacin de memoria de la biblioteca libc que ofrecen un control ms exhaustivo de lo que se hace con la memoria.

Bibliotecas bsicas Glib (2)

Biblioteca Glib: descripcin

Estructuras de datos: proporciona funciones para tratar con listas enlazadas (simple y doblemente enlazadas), arrays dinmicos, tablas de "hash", etc. Bucle de ejecucin: glib proporciona un bucle de ejecucin (GMainLoop) que permite convertir en asncrona la ejecucin del programa, permaneciendo a la escucha de eventos, actuando cuando stos se reciben. De aplicacin en interfaces grficas y otros como alarmas, I/O, etc. Sistema de objetos: permite usar programacin orientada a objetos en C, proporcionando herencia de clases, polimorfismo, etc.

Bibliotecas bsicas GTK+ 2.0 (1)

Biblioteca GTK+ 2.0: descripcin

Biblioteca para el desarrollo de interfaces grficas, que define los widgets y su funcionamiento. Forman parte de GTK+:

GDK implementa el nivel ms bajo de la arquitectura, forma una capa sobre la implementacin grfica real (p.ej. X Window), y se reescribe para cada plataforma. gdk-pixbuf permite el tratamiento de imgenes grficas. Pango permite la representacin de caracteres en distintos alfabetos (occidental, cirilico, rabe, chino, etc). Todas las aplicaciones GNOME van a hacen uso de Pango para la representacin de texto en pantalla.

Bibliotecas bsicas GTK+ 2.0 (2)

Biblioteca GTK+: descripcin

ATK es una librera de clases abstractas cuyo objetivo es servir de base para el desarrollo de aplicaciones accesibles para personas con deficiencias fsicas. gnome-libs constituye una capa sobre todos los servicios ofrecidos por GNOME (acceso a la configuracin, el panel, componentes, etc) Gconf permite el manejo de ficheros de configuracin, totalmente transparente a la red, ideal para compartir los datos entre distintas aplicaciones y distintas mquinas.

Bibliotecas bsicas GTK+ 2.0 (3)

Biblioteca GTK+: descripcin

gnome-vfs ofrece un sistema de ficheros virtual, con acceso a ficheros convencionales, mquinas remotas o protocolos de red como HTTP, FTP, etc. libxml/libxslt manejo de datos XML y XSLT. libglade carga de interfaces grficas generadas por Glade.

Biblioteca Glib Tipos de datos (1)


Tipos en GLib similares a los de C. Tipos GLib. gchar gint gshort glong gfloat Tipos estndar C. char int short long float

Biblioteca Glib Tipos de datos (2)

Tipos GLib. gdouble gpointer, gconstpointer

Tipos estndar C. double void *

gpointer es un puntero sin tipo, void *. gconstpointer es un puntero a una constante

Biblioteca Glib Tipos de datos (3)

Tipos GLib. guchar guint gushort gulong

Tipos estndar C. unsigned char unsigned int unsigned short unsigned long

Biblioteca Glib Tipos de datos (4)


Tipos que aseguran el tamao del dato entre plataformas: Tipo gint8 guint8 gint16 guint16 gint32 Rango del tamao del dato -128 a 127 0 a 255 -32.768 a 32.767 0 a 65535 -2.147.483.648 a 2.147.483.647

Biblioteca Glib Tipos de datos (5)


Tipo guint32 gint64 Rango del tamao del dato 0 a 4.294.967.295 -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 guint64 0 a 18.446.744.073.709.551.615

Biblioteca Glib Tipos de datos (6)


Tipos nuevos que no estn en el estndar de C: Tipo gboolean gsize gssize Definicin Este tipo es booleano y slo contendr los valores TRUE o FALSE. Es un entero 32 bits sin signo que sirve para representar tamaos de estructuras de datos. Es un entero de 32 bits con signo, que sirve para representar tamaos de estructuras de datos.

Biblioteca Glib Funciones (1)

Algunas funciones de glib:

Alternativa a printf: void g_print (const gchar *format, ...); Depuracin con g_assert(): Esta funcin recibe como parmetro un enunciado lgico y comprueba su validez. g_assert (cadena != NULL); g_print ("%s\n", cadena);

Biblioteca Glib Funciones (2)


Al compilar, si se produce un error, el mensaje da informacin del proceso donde se rompi la condicin y muestra por pantalla informacin del archivo, de la lnea y de la funcin en las que se viola la condicin por la cual g_assert ha parado la ejecucin. (process:457): ** ERROR **: file ejemplo.c: line 9: assertion failed: (cadena !=NULL) aborting...

Biblioteca Glib Funciones (3)


Informe de errores: #define g_message (...); #define g_warning (...); #define g_critical (...); #define g_error (...); Ejemplo: g_warning ("Aviso\n");

Biblioteca Glib Sistema de objetos (1)

Aplicando al sistema de objetos de GLib (GObject) las caractersticas del lenguaje C, se implementa una POO casi total. GObject es una clase abstracta, de la que no se pueden crear instancias directamente, aunque s contiene alguna implementacin, como es toda la gestin del control de vida del objeto, de sus seales y manejadores, etc.

Biblioteca Glib Sistema de objetos (2)

Herencia: la creacin de clases que heredan la funcionalidad de otras clases ya existentes. Esto permite crear clases con la funcionalidad bsica y, basadas en dicha clase, crear otras que aadan una funcionalidad ms especfica. Polimorfismo, que permite tratar a un mismo objeto bajo distintas personalidades. Interfaces, que permite la definicin de interfaces (clases abstractas) y su posterior implementacin en clases.

Biblioteca GTK+ 2.0 Descripcin (1)

GTK+ es la biblioteca grfica sobre la que se sustenta todo el interfaz grfico de GNOME. Es una librera que contiene todo lo necesario para el desarrollo de interfaces grficas, permitiendo la posibilidad de crear todo tipo de widgets, desde los ms bsicos, como botones, etiquetas, cajas de texto, hasta cosas ms complejas como selectores de ficheros, colores, fuentes, cajas de texto multilnea con soporte para todo tipo de efectos sobre el texto, etc.

Biblioteca GTK+ 2.0 Descripcin (2)

Un widget es personalizable.

un

componente

software

visible

Los widgets se combinan para construir los interfaces grficos de usuario. El programador los adapta segn sus necesidades sin tener que escribir ms cdigo que el necesario para definir los nuevos valores de las propiedades de los widgets.

Biblioteca GTK+ 2.0 Descripcin (3)

La librera GTK+ sigue el modelo de programacin orientado a objetos. La jerarqua de objetos comienza en GObject de la librera Glib del que hereda GtkObject. Todos los widgets heredan de la clase de objetos GtkWidget, que a su vez hereda directamente de GtkObject. La clase GtkWidget contiene las propiedades comunes a todos los widgets; cada widget particular le aade sus propias propiedades.

Biblioteca GTK+ 2.0 Widgets (1)

Los widgets se definen mediante punteros a una estructura GtkWidget. El proceso de creaccin de un widget consta de dos pasos: el de creacin propiamente dicho y el de visualizacin. gtk_nombre_new() gtk_widget_show()

Biblioteca GTK+ 2.0 Widgets (2)

GtkWidget *gtk_button_new_with_label (const gchar *label); GtkWidget *check_button ; check_button = gtk_button_new_with_label("texto");

Biblioteca GTK+ 2.0 Widgets (3)

La funcin de creacin de un widget gtk_nombre_new devuelve un puntero a un objeto de tipo GtkWidget y no un puntero a un widget del tipo creado. Por ejemplo, la funcin gtk_button_new devuelve un puntero a un objeto de GtkWidget y no una referencia a un botn. Esta referencia puede convertirse a una referencia a un objeto GtkButton mediante la macro GTK_BUTTON, si se desea utilizar en lugares donde se requieran objetos botones.

Biblioteca GTK+ 2.0 Widgets (4)

Aunque sera posible pasar en esos casos la referencia genrica, el compilador se quejar si se hace as posibilitando un control de tipos de objetos. Todo widget tiene una macro de conversin de una referencia genrica a una referencia al tipo propio.

Biblioteca GTK+ 2.0 Eventos (1)

GTK+ usa el modelo de programacin por eventos. Este modelo consiste en la asociacin de determinadas acciones ("eventos") a determinadas operaciones ("funciones"). Los eventos en GTK son seales especificadas en la definicin de las clases de los distintos widgets. As, por ejemplo, el widget GtkButton tiene definida una seal llamada "clicked" que es emitida cuando el botn en cuestin es pulsado por el usuario. La aplicacin se "conecta" a dicha seal para ser informada por GTK+ cada vez que dicho botn es pulsado.

Biblioteca GTK+ 2.0 Eventos (2)

Eventos y seales
signal clicked GtkWidget button signal b ACTION callback

signal a

Biblioteca GTK+ 2.0 Eventos (3)

El bucle de eventos es un bucle interno de GTK+, que comprueba permanentemente los estados de cada uno de los elementos de la aplicacin, e informando de dichos cambios. void gtk_main (void); void gtk_main_quit (void);

Biblioteca GTK+ 2.0 Eventos (4)


Ejemplo de una tpica aplicacin GTK+: int main (int argc, char *argv[]) { gtk_init (&argc, &argv); /* creacin del interfaz principal */ /* conexin a las distintas seales */ gtk_main (); return 0; } gtk_init() inicializa las libreras grficas.

Biblioteca GTK+ 2.0 Eventos (5)


Conectar seales y callbaks: gulong g_signal_connect ( gpointer *object, const gchar *name, GCallback func, gpointer func_data ); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (hello), NULL);

Biblioteca GTK+ 2.0 Eventos (6)

void callback_func ( GtkWidget *widget, ... /* other signal arguments */ gpointer callback_data ); G_OBJECT y G_CALLBACK son macros que permiten realizar la conversin y comprobacin de tipos de forma sencilla, adems de facilitar la legibilidad del cdigo.

Biblioteca GTK+ 2.0 Eventos (7)

Eventos delete_event y destroy: delete_event es emitido cuando usamos el gestor de ventanas para cerrar la ventana, o cuando usamos la llamada gtk_widget_destroy() pasando el widget de la ventana como el objeto a destruir. destroy es emitido cuando, en el "delete_event", devolvemos el valor FALSE. manejador

Biblioteca GTK+ 2.0 Eventos (8)

El gestor de ventanas emite el evento "delete_event" a la aplicacin y en ese momento se llamar a la funcin que hemos definido con el nombre "delete_event" . Ahora podemos reaccionar de varias formas dentro de la funcin: podemos ignorar el evento, procesarlo o simplemente cerrar la aplicacin. El valor que devuelva esta funcin de conexin le permite a GTK conocer qu accin debe llevar a cabo.

Biblioteca GTK+ 2.0 Eventos (9)

Si devolvemos TRUE, estamos indicando que no queremos que se emita la seal "destroy", lo que permitir que nuestra aplicacin siga ejecutndose. Si devolvemos FALSE, indicaremos que se emita la seal "destroy", evento que ser recogido por nuestra funcin de conexin "destroy".

Biblioteca GTK+ 2.0 Eventos (10)

g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL); g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (window));

Biblioteca GTK+ 2.0 Contenedores (1)

GTK+ usa el modelo de contenedores, donde no es necesario el uso de coordenadas. Se crean distintos tipos de contenedores, cada uno de los cuales coloca los widgets dentro de s mismo de una forma determinada. El propio contenedor se encarga de controlar dichos widgets cuando la ventana contenedora cambie de tamao.

Biblioteca GTK+ 2.0 Contenedores (2)

GtkHBox y GtkVBox son cajas invisibles que sirven para empaquetar los widgets que se vayan a colocar dentro de una ventana u otro contenedor. Cuando se empaquetan widgets en una caja horizontal (GtkHBox) se insertan horizontalmente de izquierda a derecha o de derecha a izquierda. En una caja vertical (GtkVBox) se insertan de arriba a abajo.

Biblioteca GTK+ 2.0 Contenedores (3)

Para crear una caja horizontal se hace una llamada a la funcin gtk_hbox_new(), y para cajas verticales, gtk_vbox_new(). GtkWidget * gtk_hbox_new (gboolean homogenous, gint spacing); GtkWidget * gtk_vbox_new (gboolean homogenous, gint spacing);

Biblioteca GTK+ 2.0 Contenedores (4)

El argumento homogeneous controla si cada botn dentro de la caja tiene el mismo tamao (la misma anchura en una hbox y la misma altura en una vbox). Si este argumento est a TRUE, las funciones de gtk_box_pack() funcionan como si el argumento expand estuviera siempre a TRUE. El argumento spacing controla el espacio aadido entre los botones. La figura anterior muestra el resultado y la diferencia con el argumento padding de las funciones gtk_box_pack().

Biblioteca GTK+ 2.0 Contenedores (5)

Las funciones gtk_box_pack_start() y gtk_box_pack_end se usan para colocar los widgets dentro de las cajas creadas. La funcin gtk_box_pack_start coloca los widgets de arriba a abajo en una caja vertical y de izquierda a derecha en una horizontal. gtk_box_pack_end() hace lo contrario, que es colocar los widgets de abajo a arriba en una caja vertical y de derecha a izquierda en una horizontal.

Biblioteca GTK+ 2.0 Contenedores (6)

void gtk_box_pack_start (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);

void gtk_box_pack_end (GtkBox *box, GtkWidget *child, gboolean expand, gboolean fill, guint padding);

Biblioteca GTK+ 2.0 Contenedores (7)

El argumento expand controla que los botones se extiendan hasta rellenar todo el espacio dentro de la caja (TRUE), o que la caja se ajuste al tamao de los botones (FALSE). Con expand a FALSE se pueden alinear los botones a la izquierda o a la derecha. El argumento fill de las funciones gtk_box_pack controla si el espacio extra se coloca en los botones (TRUE), o como espacio extra entre cada botn (FALSE). Esto slo tiene validez si el argumento expand est a TRUE. El argumento padding controla el espacio aadido a cada lado del botn.

Biblioteca GTK+ 2.0 Contenedores (8)


Otros contenedores:

GtkTable GtkButtonBox GtkNotebook GtkFrame GtkFixed, que permite colocar los widgets en una posicin fija dentro de la ventana, relativa a la esquina superior izquierda de la misma (coordenadas relativas).

Biblioteca GTK+ 2.0 Ventanas (GtkWindow)

Las ventanas derivan de la clase GtkWindow, que a su vez deriva de GtkContainer. GtkWindow es el objeto ventana de nivel ms alto, y puede contener a otros widgets. gtk_window_new() crea un nuevo objeto GtkWindow, que normalmente ser una ventana del nivel ms alto (el tipo de la ventana debera de ser GTK_WINDOW_TOPLEVEL).

Biblioteca GTK+ 2.0 Dilogos (GtkDialog)

Los dilogos son ventanas temporales, que se usan para obtener o mostrar determinada informacin del/al usuario. GtkWidget* gtk_dialog_new_with_buttons ( const gchar *title, GtkWindow *parent, GtkDialogFlags flags, const gchar *first_button_text, ...);

Biblioteca GTK+ 2.0 Dilogos (GtkDialog)

dialog = gtk_dialog_new_with_buttons ( "Ttulo del dilogo", parent_window, 0, "Cerrar", GTK_RESPONSE_CLOSE, NULL); El ltimo parmetro debe ser siempre NULL, que marca el fin de la lista de botones.

Biblioteca GTK+ 2.0 Ventanas de mensaje (GtkMessageDialog)

GtkMessageDialog muestra un dilogo con una imagen que representa el tipo de mensaje (Error, Pregunta, etc.) adems de algn texto aclaratorio. Es un caso particular de GtkMessageDialog.

dialog = gtk_message_dialog_new( main_application_window, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Error loading file 's': s", filename, g_strerror (errno));

Biblioteca GTK+ 2.0 Etiquetas (GtkLabel)

Las etiquetas son widgets que nos permiten mostrar informacin (texto). GtkWidget* gtk_label_new (const char *str);

Biblioteca GTK+ 2.0 Entradas de texto (GtkEntry)

El widget GtkEntry permite mostrar e introducir texto en una lnea de un cuadro de dilogo.

GtkWidget *gtk_entry_new( void ); gchar *gtk_entry_get_text( GtkEntry *entry ); void gtk_entry_set_text( GtkEntry *entry, const gchar *text );

Biblioteca GTK+ 2.0 Imgenes (GtkImage)

GtkImage muestra una imagen por pantalla. GtkWidget *image; image = gtk_image_new_from_file ("myfile.png");

Biblioteca GTK+ 2.0 Botones (GtkButton)


Se puede usar la funcin: gtk_button_new_with_label() o gtk_button_new_with_mnemonic() para crear un botn con etiqueta. gtk_button_new_with_stock() para crear un botn que contenga la imagen y el texto desde un stock item. gtk_button_new() para crear un botn en blanco.

Biblioteca GTK+ 2.0 Botones (GtkButton)


Seales de GtkButton: pressed - emitido cuando el puntero es pulsado en el widget GtkButton. released - emitido cuando el puntero es levantado del widget GtkButton. clicked - emitido cuando el puntero el pulsado y levantado del widget GtkButton. enter - emitido cuando el puntero entra en el widget GtkButton. leave - emitido cuando el puntero abandona el widget GtkButton.

Biblioteca GTK+ 2.0 Otros Widgets

GtkAccelLabel: Los widgets GtkAccelLabel principalmente en la construccin de mens. H/V Scrollbar GtkScrolledWindow Barras de progreso (GtkProgressBar) Barras de estado (GtkStatusBar) GtkToggleButton

se

usan

Biblioteca GTK+ 2.0 Otros Widgets

GtkCheckButton GtkRadioButton GtkMenu GtkToolbar GtkCombo Ventanas de seleccin (GtkFileChooser, GtkColorSelection, GtkFontSelection): GtkTreeView: rboles y listas en GTK+ (diseo MVC)

Biblioteca GTK+ 2.0 Herramientas

DevHelp: Visor de ayuda para desarrolladores GNOME 2

Widget Gallery

Anjuta: entorno IDE Glade: diseo interfaces gedit, vim y gcc en lnea de comandos Bibliografa:

http://developer.gnome.org/doc/API/ http://www.es.gnome.org/Documentacion

Biblioteca GTK+ 2.0 Herramientas

Compilacin: se pasa como parmetro la biblioteca gtk+-2.0 gcc `pkg-config --cflags --libs gtk+-2.0` hello-world.c -o hello-world

Biblioteca GTK+ 2.0 Bindings


Language bindings: C++ C# Java Python Perl Guile Ruby Ada Haskell gtkmm Gtk# java-gnome PyGTK gtk2-perl guile-gnome Ruby-GNOME2 GtkAda Gtk2Hs

Biblioteca GTK+ 2.0 Programacin

EJEMPLOS

Biblioteca GTK+ 2.0

GRACIAS

Potrebbero piacerti anche