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" ).
Nelle proprietà del vbox settate "spaziatura" a 12, otterrete questo:
Avete quindi adesso una finestra divisa in due celle, una in alto ed una in basso.
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
Adesso con lo strumento hbox () dividete la cella in alto in due, e settate anche qui la "spaziatura" a 12.
Otterrete questo:
Osservate nel vostro "albero degli oggetti" (ispettore), come hbox sia un ramo al di sotto di vbox.
Adesso prendete lo strumento immagine () e piazzate una immagine nella cella in alto a sinistra.
Cliccateci sopra e preparatevi a modificarne le proprietà :
Modifichiamo le proprietà dell'immagine, in "Modifica tipo" selezionate "stock", e in "Immagine stock selezionate il segnale di pericolo.
Inoltre, sempre nelle proprietà dell'immagine, modifichiamo "Dimensione icona" e impostatela a 6.
Adesso mettete una label () nella cella accanto all'immagine.
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.
/* 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;
}
/* 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;
}
/* 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;
}
che stupido che sono stato: bastava ovviamente aggiungere la libreria giusta!
ciao ciao
Grazie per avere postato anche la soluzione :)
Può servire a tutti.
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)
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..
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...
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.
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 ?
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.
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
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