Etnablog.altervista.org :)

Visitatore: 1311402
Welcome ospite
Menu di accessibilità:
Dimensione carattere:

Home > Programmazione C > Glade 3 e Anjuta: creazione di un bottone
Contenuto della pagina:
25 Maggio 2007

Glade 3 e Anjuta: creazione di un bottone

Guida Glade (seconda parte) 

Nella puntata precedente di questa guida, avevamo visto semplicemente come si crea una semplice finestra con un pò di testo dentro, ed avevamo visto come rappresentarla e come compilare il tutto.

C è infatti un linguaggio che và compilato, cioè il codice scritto dal programmatore, in un linguaggio a lui comprensibile, va tradotto in un formato comprensibile alla macchina.

Una volta tradotto ("compilato") si ottiene un file detto "eseguibile" che da noi non è più modificabile.

Il linguaggio "Python" non è "compilato" ma "interpretato", detto in parole povere, non avete bisogno, con Python, di compilare il vostro script per eseguirlo.

Nel tutorial di oggi, cercherò di essere più rapido rispetto l'altra volta, nel senso che non mi dilungherò a spiegare dettagli già trattati nella scorsa puntata della guida... Però aggi imparerete a fare mooolte cose :)

Senza indugio, quindi aprite Anjuta e create un nuovo progetto "LibGlade 2.0" servendovi del Wizard, e chiamate questo progetto "progetto_bottone".

Quindi aprite Glade: manipoliamo il file "progetto_bottone.glade" creato da Anjuta.

Dividete la finestra (ancora grigia e vuota) in due celle orizzontali (strumento vbox o "casella verticale" casella verticale).

Nelle proprietà del vbox settate "spaziatura" a 12, otterrete questo:
lez-2-1.png
Avete quindi adesso una finestra divisa in due celle, una in alto ed una in basso.

attention.gif Se cliccate sulle foto di questo blog le ingrandirete. Se una volta ingrandite cliccate nell'angolino in basso a destra della foto, sarà ancora più grande smile.gif

Adesso con lo strumento hbox (casella orizzontale) dividete la cella in alto in due, e settate anche qui la "spaziatura" a 12.
Otterrete questo:
lez2_2.png
Osservate nel vostro "albero degli oggetti" (ispettore), come hbox sia un ramo al di sotto di vbox.

Adesso prendete lo strumento immagine (strumento immagine) e piazzate una immagine nella cella in alto a sinistra.
Cliccateci sopra e preparatevi a modificarne le proprietà:
lez2_3.png
Modifichiamo le proprietà dell'immagine, in "Modifica tipo" selezionate "stock", e in "Immagine stock selezionate il segnale di pericolo.
lez2_4.png
Inoltre, sempre nelle proprietà dell'immagine, modifichiamo "Dimensione icona" e impostatela a 6.

Adesso mettete una label (strumento label) nella cella accanto all'immagine.
lez2_5.png
Adesso modificate il contenuto nella label e scrivetegli dentro questo:


<span weight="bold" size="larger">Questo programma non fa nulla di importante</span>

Non è stato aggiunto codice al programma se non quello sufficiente a mostrare il pulsante, che chiuderà il tutto.

Il risultato sarà questo:
lez2_6.png
A questo punto, sempre nelle proprietà, premete il bottone "usa i marcatori".
lez2_7.png
Adesso selezionate lo strumento "dialog-action-area" (strumento dialog-action-area), mettetelo nella cella rimasta libera e, dalle proprietà di questo, impostate come "Numero di elementi" il numero 1.
lez2_8.png
Prendete a questo punto un bottone (strumento bottone) e piazzatelo lì dove lo spazio è rimasto libero.
lez2_9.png
Adesso rendete questo bottone, agendo sulle sue opzioni, un bottone di tipo "stock" e scegliete per lui il tipo "OK".
lez2_10.png
Adesso nelle proprietà del bottone, andate dove c'è "segnali" e selezionate "clicked" e nel campo accanto scrivete "ok_button_clicked" (come nella foto) e assicuratevi di confermarne la modifica con invio.
lez2_11.png
Adesso modificate il nome del bottone e chiamatelo "okbutton".
lez2_12.png
Bene! con Glade abbiamo finito, adesso prendiamo di nuovo Anjuta e modifichiamo main.c

main.c dovrebbe presentarsi così ai vostri occhi:

/* Created by Anjuta version 1.2.4a */
/*	This file will not be overwritten */

#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif

#include <gnome.h>
#include <glade/glade.h>

int main (int argc, char *argv[])
{
	GtkWidget *window1;
	GladeXML *xml;

	#ifdef ENABLE_NLS
		bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
		textdomain (PACKAGE);
	#endif

	gnome_init (PACKAGE, VERSION, argc, argv);
	glade_gnome_init ();
	/*
	 * The .glade filename should be on the next line.
	 */
	xml = glade_xml_new (PACKAGE_SOURCE_DIR"/progetto_bottone.glade", NULL, NULL);

	/* This is important */
	glade_xml_signal_autoconnect (xml);
	window1 = glade_xml_get_widget (xml, "window1");
	gtk_widget_show (window1);

	gtk_main ();
	return 0;
}


Modificatelo e fatelo diventare così come sto per mostrarvi (sostituite tutto main.c):


/* Created by Anjuta version 1.2.4a */
/*	This file will not be overwritten */

#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif

#include <gnome.h>
#include <glade/glade.h>

void ok_button_clicked (GtkWidget *widget, gpointer user_data)
{
  printf ("Grazie per aver provato il programma :)");
  gtk_main_quit ();
}


int
main (int argc, char *argv[])
{
  GladeXML  *main_window;
  GtkWidget *widget;

  gtk_init (&argc, &argv);

  /* Carica l'interfaccia utente */
  main_window = glade_xml_new (PACKAGE_SOURCE_DIR"/progetto_bottone.glade", NULL, NULL);

	/* Predispone la gestione del bottone chiamato "okbutton" */
  widget = glade_xml_get_widget (main_window, "okbutton");
  g_signal_connect (G_OBJECT (widget), "clicked",
                    G_CALLBACK (ok_button_clicked),
                    NULL);
	
  /* Chiusura del programma quando l'utente chiude la finestra */
  widget = glade_xml_get_widget (main_window, "window1");
  g_signal_connect (G_OBJECT (widget), "delete_event",
                    G_CALLBACK (gtk_main_quit), NULL);

  /* Avvia il ciclo */
  gtk_main ();

  return 0;
}



Bene a questo punto salvate, fate "genera" (o "make") e infine esegui (o se preferite premete F11 e poi F3).

Dovrebbe funzionare :) se non funziona riguardatevi qualche passaggio.

Ha funzionato? Bene, adesso, con Glade, modificate di nuovo il vostro "progetto_bottone.glade".

Dobbiamo modificare un "segnale" nella nostra finestra (window1). Quindi selezioniamo "window1" e in "segnali" scegliere "GtkWidget" e in questo selezionare "delete-event". Qui inserite "gtk_main_quit".

A questo punto salvate progetto_bottone.glade, riaprite Anjuta e modificate così il vostro file main.c :


/* Created by Anjuta version 1.2.4a */
/*	This file will not be overwritten */

#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif

#include <gnome.h>
#include <glade/glade.h>

void ok_button_clicked (GtkWidget *widget, gpointer user_data)
{
  printf ("Grazie per aver provato il programma :)");
  gtk_main_quit ();
}


int
main (int argc, char *argv[])
{
  GladeXML  *main_window;
  GtkWidget *widget;

  gtk_init (&argc, &argv);

  /* Carica l'interfaccia utente */
  main_window = glade_xml_new (PACKAGE_SOURCE_DIR"/progetto_bottone.glade", NULL, NULL);
  glade_xml_signal_autoconnect (main_window);

  /* Avvia il ciclo */
  gtk_main ();

  return 0;
}



Ha funzionato anche adesso? Studiate le differenze tra questo ultimo script e il precedente: capirete come il comando "glade_xml_signal_autoconnect" abbia per voi fatto quella che si chiama "callback" verso la funzione "gtk_main_quit" (che serve a chiudere tutto). :)

Ad ogni modo potete scaricare l'intero progetto appena realizzato da qui:
http://etnablog.altervista.org/mis c/script-c/progetto_bottone.tar.gz

Ne lla prossima puntata parleremo un pò di "codice" :)

A presto!

Descrizioni usate nelle foto: 
Postato da: Etnablog in Programmazione C alle 15:32

Permalink | Commenti(10)
Inserisci commento

Commenti:

ciao. Ottima guida. Io sono alle prime armi.
Se genero un progetto C tutto funziona. Se invece parto con un progetto C++ l'ultima modifica al codice non mi funziona e in fase di run mi dice:
libglade-WARNING **: could not find signal handler 'ok_button_clicked'.
come mai?

grazie
ilpaso

 

Postato da: ilpaso il 21 Settembre 2007 alle 10:39

che stupido che sono stato: bastava ovviamente aggiungere la libreria giusta!
ciao ciao

 

Postato da: ilpaso il 04 Ottobre 2007 alle 10:31

Avatar

Grazie per avere postato anche la soluzione :)
Può servire a tutti. wink.gif

 

Postato da: Etnablog il 04 Ottobre 2007 alle 13:50

ciao, e scusami, ho provato a fare quello che descrivi, ma quando con anjuta tento di aprire un file glade mi da il segurnte errore, mi puoi aiutare?
Grazie milla
*** glibc detected *** anjuta: double free or corruption (fasttop): 0x086ca148 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[ 0xb727ed65]
/lib/tls/i686/cmov/libc.so. 6(cfree+0x90)[0xb7282800]
/usr/lib/libg lib-2.0.so.0(g_free+0x31)[0xb7404961]
/ usr/lib/libanjuta.so.0[0xb73af57b]
/usr /lib/libanjuta.so.0[0xb73affd2]
/usr/li b/libgobject-2.0.so.0(g_object_unref+0x1 6c)[0xb749faec]
/usr/lib/libanjuta.so.0 (anjuta_glue_factory_get_object_type+0x1 2f)[0xb73af95f]
/usr/lib/libanjuta.so.0 [0xb73a2a2f]
/usr/lib/libanjuta.so.0(an juta_plugin_manager_get_plugin_by_id+0xa 2)[0xb73a2e02]
/usr/lib/anjuta/libanjut a-loader.so[0xb6222c61]
/usr/lib/libgob ject-2.0.so.0(g_cclosure_marshal_VOID__V OID+0x49)[0xb74aac09]
/usr/lib/libgobje ct-2.0.so.0(g_closure_invoke+0x122)[0xb7 49d772]
/usr/lib/libgobject-2.0.so.0[0x b74ae323]
/usr/lib/libgobject-2.0.so.0( g_signal_emit_valist+0x8c7)[0xb74af847]
/usr/lib/libgobject-2.0.so.0(g_signal_e mit+0x29)[0xb74afa09]
/usr/lib/libgtk-x 11-2.0.so.0(gtk_widget_activate+0x58)[0x b7b5ffe8]
/usr/lib/libgtk-x11-2.0.so.0( gtk_menu_shell_activate_item+0x14a)[0xb7 a4a38a]
/usr/lib/libgtk-x11-2.0.so.0[0x b7a4bf28]
/usr/lib/libgtk-x11-2.0.so.0[ 0xb7a43178]
/usr/lib/libgtk-x11-2.0.so. 0(_gtk_marshal_BOOLEAN__BOXED+0x5e)[0xb7 a3d1de]
/usr/lib/libgobject-2.0.so.0[0x b749bf89]
/usr/lib/libgobject-2.0.so.0( g_closure_invoke+0x122)[0xb749d772]
/us r/lib/libgobject-2.0.so.0[0xb74ae973]
/ usr/lib/libgobject-2.0.so.0(g_signal_emi t_valist+0x68f)[0xb74af60f]
/usr/lib/li bgobject-2.0.so.0(g_signal_emit+0x29)[0x b74afa09]
/usr/lib/libgtk-x11-2.0.so.0[ 0xb7b5b498]
/usr/lib/libgtk-x11-2.0.so. 0(gtk_propagate_event+0x14f)[0xb7a3636f]
/usr/lib/libgtk-x11-2.0.so.0(gtk_main_ do_event+0x307)[0xb7a37587]
/usr/lib/li bgdk-x11-2.0.so.0[0xb7783b9a]
/usr/lib/ libglib-2.0.so.0(g_main_context_dispatch +0x17c)[0xb73fd11c]
/usr/lib/libglib-2. 0.so.0[0xb740055f]
/usr/lib/libglib-2.0 .so.0(g_main_loop_run+0x1a9)[0xb7400909]
/usr/lib/libgtk-x11-2.0.so.0(gtk_main+ 0xb4)[0xb7a379e4]
anjuta[0x805413d]
/l ib/tls/i686/cmov/libc.so.6(__libc_start_ main+0xe0)[0xb722b050]
anjuta[0x804e101 ]
======= Memory map: ========
08048000-08056000 r-xp 00000000 08:02 495621 /usr/bin/anjuta
08056000-08057000 rw-p 0000e000 08:02 495621 /usr/bin/anjuta
08057000-0872a000 rw-p 08057000 00:00 0 [heap]
b4700000-b4721000 rw-p b4700000 00:00 0
b4721000-b4800000 ---p b4721000 00:00 0
b4829000-b4833000 r-xp 00000000 08:02 2211907 /lib/libgcc_s.so.1
b4833000-b4834000 rw-p 0000a000 08:02 2211907 /lib/libgcc_s.so.1
b4834000-b4848000 r-xp 00000000 08:02 774577 /usr/lib/gnome-build-1.0/backends/libgbf -am.so
b4848000-b4849000 rw-p 00014000 08:02 774577 /usr/lib/gnome-build-1.0/backends/libgbf -am.so
b4849000-b487c000 r-xp 00000000 08:02 493616 /usr/lib/libxslt.so.1.1.21
b487c000-b48 7d000 rw-p 00032000 08:02 493616 /usr/lib/libxslt.so.1.1.21
b488f000-b48 b1000 r-xp 00000000 08:02 985774 /usr/lib/anjuta/libanjuta-gtodo.so
b48b 1000-b48b2000 rw-p 00022000 08:02 985774 /usr/lib/anjuta/libanjuta-gtodo.so
b48b 2000-b48c7000 r-xp 00000000 08:02 985809 /usr/lib/anjuta/libanjuta-symbol-browser .so
b48c7000-b48c8000 rw-p 00015000 08:02 985809 /usr/lib/anjuta/libanjuta-symbol-browser .so
b48c8000-b48f7000 r-xp 00000000 08:02 495624 /usr/lib/libanjuta-ctags.so.0.0.0
b48f7 000-b48fa000 rw-p 0002e000 08:02 495624 /usr/lib/libanjuta-ctags.so.0.0.0
b48fa 000-b48fb000 rw-p b48fa000 00:00 0
b4901000-b490c000 r-xp 00000000 08:02 985795 /usr/lib/anjuta/libanjuta-build-basic-au totools.so
b490c000-b490d000 rw-p 0000a000 08:02 985795 /usr/lib/anjuta/libanjuta-build-basic-au totools.so
b490d000-b491c000 r-xp 00000000 08:02 985836 /usr/lib/anjuta/libanjuta-search.so
b49 1c000-b491d000 rw-p 0000f000 08:02 985836 /usr/lib/anjuta/libanjuta-search.so
b49 1d000-b4982000 r-xp 00000000 08:02 493168 /usr/lib/libgnomeprint-2-2.so.0.1.0
b49 82000-b4984000 rw-p 00065000 08:02 493168 /usr/lib/libgnomeprint-2-2.so.0.1.0
b49 84000-b49c2000 r-xp 00000000 08:02 493170 /usr/lib/libgnomeprintui-2-2.so.0.1.0Aborted (core dumped)

 

Postato da: camus il 16 Febbraio 2008 alle 21:16

Avatar

Ciao Camus, non sono in casa quindi non posso controllare di persona se anche da me dà questo errore (non uso anjuta da un bel po, comincio ad avere un pò di ruggine..) tuttavia a occhio e croce sembra che il problema sia dovuto proprio ad Anjuta (o alla sua pacchettizzazione?)..

Guarda cosa ho trovato, sembra essere l'esatto tuo problema:

- https://bugs.launchpad.net/ubuntu/+sourc e/anjuta/+bug/125343
- http://bugs.debian.org/cgi-bin/bugreport .cgi?bug=437146 (occhio a questo link, sembra vi sia una possibile soluzione al problema..)
- http://lists4.suse.de/opensuse-bugs/2007 -10/msg10246.html

Basta che su google cerchi "anjuta: double free or corruption" e di questi errori te ne escono a centinaia..

..Anche un altro utente ha scritto qui nel blog, ed aveva problemi ad aprire il file .glade con Anjuta..

Fammi sapere come va a finire, se ancora hai problemi proverò a reinstallare Anjuta anche io..

 

Postato da: Etnablog il 17 Febbraio 2008 alle 2:05

scusami per il commento doppio ma ho fatto l'aggiornamento della pagina e l'ha messo, puoi cancellarlo? grazie.
intanto provo a risolvere il problema e ti faccio sapere, grazie mille...

 

Postato da: camus il 17 Febbraio 2008 alle 10:24

risolto installando l'ultima versione di anjuta, la 2.2.2 (in quanto dai rep di ubuntu aveva la 2.2.0) grazie per il tuo prezioso aiuto.

 

Postato da: camus il 17 Febbraio 2008 alle 12:03

Per prima cosa, vorrei ringraziarti per l'ottima guida è davvero moooolto utile.
Ho un problemino...ho inserito il bottone ok, ma quando vado a modificare le proprietà del bottone, su "segnali" nel campo accanto a "clicked" c'è un menù a tendina, dal quale si possono scegliere diverse opzioni, la più simile a quella scritta da te è "on_okbutton_clicked", ho provato ad inserirla, ma in fase di esecuzione mi da un warning :
(prova_bottone:2978): libglade-WARNING **: could not find signal handler 'on_okbutton_clicked'
Analogamente se anzichè scegliere una fra le possibili opzioni del menù a tendina scrivo "ok_button_clicked", mi da il seguente warning :
(prova_bottone:2978): libglade-WARNING **: could not find signal handler 'ok_button_clicked'
Uso anjuta 2.2.3 e glade3.4.1 su Fedora 7
Come posso fare ?

 

Postato da: Raffaele il 06 Ottobre 2008 alle 16:04

Ho aggirato il problema utilizzando Glade2, con questo software, non è necessario utilizzare Anjuta. A chiunque fosse interessato, c'è una buona guida al seguente link :
http://www.kplug.org/glade_tutorial/g lade2_tutorial/glade2_introduction.html
Vorrei ringraziarti nuovamente per l'ottimo tutorial.

 

Postato da: Raffaele il 08 Ottobre 2008 alle 15:34

ciao... grazie per la guida...
avrei però un problemino..... ho fatto un copia e incolla del codice ma quando vado a compilare mi
da un sacco di errori... ad esempio per la riga
#include <gnome.h>
mi dice nessun file o directory


help grazie

 

Postato da: jack il 01 Novembre 2009 alle 17:30

Solo gli utenti registrati possono lasciare commenti
*1 user online
Caricamento pagina: 0.03 s