Tag: GTK+

Ma quanto mi divertirò ad usare le GTK?

Posted by – 20 gennaio 2010

Ebbene si, proprio quando tutta l’ analisi matematica del mondo ti sta addosso e dovunque ti giri vedi solo numeri complessi, integrali, limiti, funzioni…decidi che è arrivato il momento di staccare un attimo e sei convinto che è arrivata l’ ora di imparare ad usare le librerie GTK+ con il C!! :D
Ergo ho gettato tutti i libri per terra e mi sono messo a leggere questa stupenda guida che tra l’ altro consiglio a tutti: http://www.gadaleta.org/listing/Corso%20di%20gtk/
Il risultato??..già dopo aver letto i primi paragrafi ho buttato già un pò di codice. Certo, è un programmino semplicissimo atto ad illustrare alcune delle potenzilità di GTK+.
In pratica cliccando su uno dei nove bottoni creati grazie al widget “table”, e grazie alla funzione G_CALLBACK(che richiama “al click” di un bottone un’ altra funzione), il terminale stamperà la posizione del bottone nella “matricetta” 3×3!
Eccolo qui(davvero molto semplice :) )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* Copyright 2010 Antonio Murdaca <tonicooperi13@tonicooperi.eu>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 3 of the License, or
     (at your option) any later version.
 
     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     GNU General Public License for more details.
 
     You should have received a copy of the GNU General Public License
     along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
 
/* Semplicissimo programma che fa uso della programmazione in C con le GTK+. 
Stampa sul terminale la posizione del bottone premuto. */
 
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
 
void chiudi(GtkWidget *widget,gpointer data)
	{ 
		gtk_main_quit();
	}
 
//funzioni per determinare la posizione dei bottoni della prima riga
void button_11(GtkWidget *widget){
	g_print("bottone nella prima riga e nella prima colonna!\n");
			}	       
 
void button_12(GtkWidget *widget){
	g_print("bottone nella prima riga e nella seconda colonna!\n");
			}
 
void button_13(GtkWidget *widget){
	g_print("bottone nella prima riga e nella terza colonna!\n");
			}
//funzioni per determinare la posizione dei bottoni della seconda riga
void button_21(GtkWidget *widget){
	g_print("bottone nella seconda riga e nella prima colonna!\n");
			}	       
 
void button_22(GtkWidget *widget){
	g_print("bottone nella seconda riga e nella seconda colonna!\n");
			}
 
void button_23(GtkWidget *widget){
	g_print("bottone nella seconda riga e nella terza colonna!\n");
			}
//funzioni per determinare la posizione dei bottoni della terza riga
void button_31(GtkWidget *widget){
	g_print("bottone nella terza riga e nella prima colonna!\n");
			}	       
 
void button_32(GtkWidget *widget){
	g_print("bottone nella terza riga e nella seconda colonna!\n");
			}
 
void button_33(GtkWidget *widget){
	g_print("bottone nella terza riga e nella terza colonna!\n");
			}
 
int main (int argc, char *argv[]){
  GtkWidget *window; 
  GtkWidget *table;
  GtkWidget *button;
  char lbl[20];
  int i, j;
 
  gtk_init(&argc,&argv);
 
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  table = gtk_table_new(3,3,TRUE);
 
  for(i=0;i<3;i++){
     for(j=0;j<3;j++){
       sprintf(lbl,"Bottone %d,%d",i,j);
 
       button = gtk_button_new_with_label(lbl);
 
	g_signal_connect (G_OBJECT (window), "delete_event",
                    G_CALLBACK (chiudi), NULL); 
	//si poteva usare direttamente "gtk_main_quit" invece di "chiudi"
 
	switch (j){
	case 0:
		if(i==0)
		g_signal_connect (G_OBJECT (button), "clicked",
        	G_CALLBACK (button_11), NULL);
		if(i==1)
		g_signal_connect (G_OBJECT (button), "clicked",
        	G_CALLBACK (button_12), NULL);
		if(i==2)
		g_signal_connect (G_OBJECT (button), "clicked",
        	G_CALLBACK (button_13), NULL);	
	break;
	case 1:
	 	if(i==0)
		g_signal_connect (G_OBJECT (button), "clicked",
        	G_CALLBACK (button_21), NULL);
		if(i==1)
		g_signal_connect (G_OBJECT (button), "clicked",
        	G_CALLBACK (button_22), NULL);
		if(i==2)
		g_signal_connect (G_OBJECT (button), "clicked",
        	G_CALLBACK (button_23), NULL);
	break;
	case 2:
		if(i==0)
		g_signal_connect (G_OBJECT (button), "clicked",
        	G_CALLBACK (button_31), NULL);
		if(i==1)
		g_signal_connect (G_OBJECT (button), "clicked",
        	G_CALLBACK (button_32), NULL);
		if(i==2)
		g_signal_connect (G_OBJECT (button), "clicked",
        	G_CALLBACK (button_33), NULL);
	break;
		}
 
       gtk_table_attach_defaults(GTK_TABLE(table), button, i, i+1, j, j+1);
       gtk_widget_show(button);
     }
  }
  gtk_container_add(GTK_CONTAINER(window),table);
  gtk_widget_show(table);
  gtk_widget_show(window);
  gtk_main();
  return(0);
}

Ovviamente presumo che questo semplice programmino possa essere ottimizzato e magari non necessita di tutte quelle funzioni. Ma purtroppo adesso sto iniziando a programmare sul serio e quindi qualche spreco ci sarà sempre. :)
Per compilarlo basta avere installato le librerie GTK+ sul proprio pc e dare il seguente comando da terminale:

gcc -Wall -g codice.c -o eseguibile `pkg-config –cflags –libs gtk+-2.0`

Bene, dopo questa breve pausa direi che è di nuovo ora di cimentarsi nell’ analisi matematica! :D
A presto!


Switch to our mobile site