Arxius

Introducció a la programació en GTK

Escrit al 2005-02-12 00:00:00 per Twinsen

L'article consisteix en una introducció a la programació amb GTK a través d'uns petits exemples.

Hi ha una petita introducció sobre el GTK, com gestionar senyals, organitzar visualment els elements, i dos exemples.

NOTA: traducció al català d'introducció a la programació en GTK de mestratge en programari lliure de la UOC, autor original Jordi Mas.

1. Introducció i compilació


GTK és una llibreria que simplifica el desenvolupament d'interfícies gràfiques d'aplicacions. Proporciona una col·lecció de ginys (o elements visuals) que s'utilitzen freqüentment en els diàlegs d'interacció amb els usuaris, gestió d'incidències de teclat i ratolí, o suport per a fer clic i arrastrar elements entre diferents aplicacions.

La llibreria GTK va ser originalment dissenyada com a part del programa d'edició gràfica GIMP i més tard va ser adoptada com a llibreria base de l'escriptori GNOME. GTK és actualment multiplataforma i es troba disponible per a GNU/Linux, Mac i Windows, el que permet escriure aplicacions que es poden executar en diferents entorns.

GTK está escrita en llenguatge C encara que existeixen connectors que permeten utilitzar aquesta llibreria des d'un gran nombre de llenguatges com ara C#, Java, Perl, Python o C++.

GTK es basa en tres llibreries addicionals:
- Glib: una llibreria general d'utilitats com ara diferents tipus de contenidors (llistes enllaçades, matrius, etc), anàlisis de cadenes de text, temporitzadors, etc.
- Pango: una llibreria que gestiona la representació de text i tipus de lletres amb suport per a diferents cultures.
- ATK: una llibreria per a simplificar l'accessibilitat d'aplicacions, es a dir, facilitar l'ús d'aplicacions desenvolupades amb GTK a personas amb discapacitats.

Per a compilar els exemples GTK d'aquest article utilitzarem la següent línia de comandes:
gcc -Wall -g exemple1.c -o exemple1 `pkg-config --cflags –--libs gtk+-2.0`

La comanda pkg-config serveix per a obtener detalls de configuració sobre paquets de programari que tinguem instal·lat. Una vegada invocat indicant el paquet sobre el que volem obtenir informació ens retorna el directori on es troba instalada la llibreria que volem utilitzar.

La classe GtkWidget és la base de tot el sistema, ja que tots els elements gràfics hereten de GtkWidget.
A la adreça següent podem troba la documentació de totes classes que podem utilitzar: http://developer.gnome.org/doc/API/.

2. Exemple “Hola Mon"

El següent codi ens crea una finestra amb el títol "Hola mon".


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

/* Inicialització de la llibreria GTK*/
gtk_init (&argc, &argv);

/* Creació d'una finestra */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

/* Mostra la finsetra */
gtk_widget_show (window);

/* Estableix el titol de la finestra*/
gtk_window_set_title ((GtkWindow*) window, "Hola mon");

/* Entra al bucle principal del programa */
gtk_main ();

return 0;
}



El resultat que obtindrem serà:





3. Gestió de senyals



Per tal de gestionar les incidències cal assignar una funció al senyal que volem tractar, això ho podem fer amb el següent mètode:


/* Connecta la senyal 'clicked' del botó */
gtk_signal_connect (GTK_OBJECT (button_ok), "clicked", GTK_SIGNAL_FUNC
(buttonok_clicked), text_nombre);

/* Funció que es cridada al prémer el botó */
void buttonok_clicked (GtkWidget *widget, gpointer gdata)
{
g_print ("El botó Acceptar ha estat pressionat. ");
}


Quan l'usuari fa click al botó la rutina button_ok es activada.



4. Ordenació visual dels elements mitjançant caixes



GTK utilitza el concepte de caixes per a permetre al desenvolupador posicionar els elements visuals a la interfície d'usuari de forma relativa a la mida de la finestra.
Les caixes, que actuen com a contenidors de ginys, tenen l'avantatge que permeten crear interfícies que són consistents a diferents resolucions de pantalla i tipus de lletra.
Les caixes poden ser verticals o horizontals i són invisibles a l'usuari, simplement s'usen per a posicionar els ginys.

Les caixes existents són:

  • GtkHBox - Caixa que posiciona els widgets que conté de forma horitzontal
  • GtkVBox - Caixa que posiciona els widgets que conté de forma vertical



    5. Exemple de caixes i senyals



    Aquest exemple crea una caixa de text on podem escriure-hi i un botó acceptar al qual li assignem una funció.


    #include
    #include

    /* Funció que és invocada al pulsar acceptar */
    void buttonok_clicked (GtkWidget *widget, gpointer gdata)
    {
    GtkEntry *text_nombre = (GtkEntry *) gdata;
    g_print ("El boto Acceptar ha estat pressionat. Text en la caixa:");

    /* Obté el text actual de la caixa d'entrada */
    g_print (gtk_entry_get_text (text_nombre));
    g_print ("\n");
    }

    int main (int argc, char *argv[] )
    {
    GtkWidget *window;
    GtkWidget *label_nombre;
    GtkWidget *text_nombre;
    GtkWidget *button_ok;
    GtkWidget *caja_horizontal;

    /* Inicialització de la llibreria GTK*/
    gtk_init (&argc, &argv);

    /* Creació d'una finestra */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    /* Contenidor horizontal */
    caja_horizontal = gtk_hbox_new (FALSE,0);

    /* Botó acceptar */
    button_ok = gtk_button_new_with_label ("Acceptar");

    /* Descripció i caixa d'entrada del nom */
    label_nombre = gtk_label_new ("Nom:");
    text_nombre = gtk_entry_new ();
    gtk_entry_set_text (GTK_ENTRY (text_nombre), "[teclegi el seu nom]");

    /* Conecta la senyal 'clicked' del botó */
    gtk_signal_connect (GTK_OBJECT(button_ok), "clicked", GTK_SIGNAL_FUNC
    (buttonok_clicked), text_nombre);

    /* Empaquetar els widgets a la caixa horitzontal */
    gtk_box_pack_start(GTK_BOX (caja_horizontal), label_nombre, FALSE, FALSE, 4);
    gtk_box_pack_start(GTK_BOX (caja_horizontal), text_nombre, FALSE, FALSE, 4);
    gtk_box_pack_start(GTK_BOX (caja_horizontal), button_ok, FALSE, FALSE, 4);
    gtk_container_add (GTK_CONTAINER (window), caja_horizontal);

    /* Mostra totes les finestres */
    gtk_widget_show_all (window);

    /* Entra al bucle principal del programa */
    gtk_main ();

    return 0;
    }



    El resultat que obtindrem serà:

  • Categories: Articles


    Comentaris

    • Sense comentaris
    Arxius