Etnablog.altervista.org :)

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

Home > Programmazione C > Glade 3 e Anjuta: Sviluppo (guida glade3-gtk quarta parte)
Contenuto della pagina:
09 Giugno 2007

Glade 3 e Anjuta: Sviluppo (guida glade3-gtk quarta parte)

Ho deciso di raggruppare tutti gli script elementari fatti fino ad ora in un unico e più consultabile archivio. L'archivio è questo:

http://etnablog.altervista.or g/misc/script-c/programmi_c.tar.gz


Non mi dilungherò a darvi spiegazioni particolari su come agiscono gli script dato che sono abbastanza commentati.
Vi sono cinque script, ve li accenno:

prova1


Prova1, è semplicemente un bottone che premuto chiude la sua finestra.


/* 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 ("Thanks for trying out my program.n");
  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 ("example-1.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, "MainWindow");
  g_signal_connect (G_OBJECT (widget), "delete_event",
                    G_CALLBACK (gtk_main_quit), NULL);

  /* Avvia il ciclo */
  gtk_main ();

  return 0;
}


prova2


Prova2: lo script mostra alcune interazioni tra una finestra realizzata con glade e la shell, quindi va eseguito da shell. Questo script mostra:
- come usare strcmp (comparazione di stringhe)
- come inserire testo in grassetto con glade
- come usare i cicli if-else,
- come gestire un campo dove l'utente inserisce il testo, leggerne il contenuto e stamparlo su shell
- come leggere il contenuto di una label e cambiarlo
Attenzione però: in questo script la gestione delle callback avviene usando l'autoconnect cioè mediante glade_xml_signal_autoconnect (xml);


/* 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 <gtk/gtk.h>
#include <glade/glade.h>

on_button1_clicked (GtkWidget *widget, gpointer user_data)
{
  printf ("Bau n");
}

on_button2_clicked (GtkWidget *widget, gpointer user_data)
{
  printf ("Arrivederci n");
  gtk_main_quit ();
}

on_button3_clicked (GtkWidget *widget, gpointer user_data)
{
  printf ("Hai premuto button3 nn");

  gchar stringa2[80]="<span size="x-large">Ciao</span>";
  GladeXML *self = glade_get_widget_tree(GTK_WIDGET(widget));
  GtkWidget *label = glade_xml_get_widget (self, "label2");
  
  gchar *stringa1 = gtk_label_get_label(label);
  
  //gchar *stringa1 = gtk_label_get_text (label); 
  //serve a prendere solo il testo, senza tag di stile
  //invece gtk_label_get_label prende anche i tag di stile (se ci sono)

  printf ("Il contenuto di "label1" è "%s"n", stringa1);
  printf ("stringa1: %s ; stringa2: %sn", stringa1, stringa2);

  /*
  In C per comparare due stringhe fare: if (strcmp (string1, string2) == 0) 
  o if (g_str_equal (string1, string2)) 
  o if (g_utf8_collate (string1, string2) == 0)
  */
  if (strcmp (stringa1, stringa2) == 0) {
	  gtk_label_set_markup (GTK_LABEL(label), "<span size="x-large">è uguale a output</span>");
	  //gtk_label_set_text(GTK_LABEL(label),"è uguale a output");
  }
  else {
	  gchar *saluto = "Ciao";
	  //g_strconcat: serve ad unire piu stringhe. Ricordarsi il NULL alla fine!
	  gchar *stringa3 = g_strconcat("<span size="x-large">",saluto,"</span>", NULL);
	  gtk_label_set_markup (GTK_LABEL(label), stringa3);
	  //invece avrei usato:
	  //gtk_label_set_text(GTK_LABEL(label),stringa2);
	  //Se non avevo tag di stile <span>
  }
}

void on_entry1_activate (GtkWidget *widget, gpointer user_data)
{
   printf ("Hai scritto il tuo nome.n");
  
   gchar output[80]="Ciao ";
   strcat(output,gtk_entry_get_text(GTK_ENTRY(widget)));

   printf ("%s n",output);
}

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 ("provalibglade.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;
}


prova3


Prova3: questo script vi mostra come:
- Creare con glade una finestra "notebook"
- Come usare una textview con scroller verticale
- come inserire immagini nelle finestre di glade e scrollarle
- Come cambiare il puntatore del mouse al passaggio sopra un widget


/* 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 <gtk/gtk.h>
#include <glade/glade.h>

on_button1_clicked (GtkWidget *widget, gpointer user_data)
{
  printf ("Bau n");
}

on_button2_clicked (GtkWidget *widget, gpointer user_data)
{
  printf ("Arrivederci n");
  gtk_main_quit ();
}

on_button3_clicked (GtkWidget *widget, gpointer user_data)
{
  printf ("Hai premuto button3 nn");

  gchar stringa2[80]="<span size="x-large">Ciao</span>";
  GladeXML *self = glade_get_widget_tree(GTK_WIDGET(widget));
  GtkWidget *label = glade_xml_get_widget (self, "label2");
  
  gchar *stringa1 = gtk_label_get_label(label);
  
  //gchar *stringa1 = gtk_label_get_text (label); 
  //serve a prendere solo il testo, senza tag di stile
  //invece gtk_label_get_label prende anche i tag di stile (se ci sono)

  printf ("Il contenuto di "label1" è "%s"n", stringa1);
  printf ("stringa1: %s ; stringa2: %sn", stringa1, stringa2);

  /*
  In C per comparare due stringhe fare: if (strcmp (string1, string2) == 0) 
  o if (g_str_equal (string1, string2)) 
  o if (g_utf8_collate (string1, string2) == 0)
  */
  if (strcmp (stringa1, stringa2) == 0) {
	  gtk_label_set_markup (GTK_LABEL(label), "<span size="x-large">è uguale a output</span>");
	  //gtk_label_set_text(GTK_LABEL(label),"è uguale a output");
  }
  else {
	  gchar *saluto = "Ciao";
	  //g_strconcat: serve ad unire piu stringhe. Ricordarsi il NULL alla fine!
	  gchar *stringa3 = g_strconcat("<span size="x-large">",saluto,"</span>", NULL);
	  gtk_label_set_markup (GTK_LABEL(label), stringa3);
	  //invece avrei usato:
	  //gtk_label_set_text(GTK_LABEL(label),stringa2);
	  //Se non avevo tag di stile <span>
  }
}

void on_entry1_activate (GtkWidget *widget, gpointer user_data)
{
   printf ("Hai scritto il tuo nome.n");
  
   gchar output[80]="Ciao ";
   strcat(output,gtk_entry_get_text(GTK_ENTRY(widget)));

   printf ("%s n",output);
}

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 ("provalibglade.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;
}


prova4


Prova4: mostra come fare ad aprire altre finestre, e a convertire un intero in una stringa.
Questo sarà probabilmente l'ultimo script che realizzerò usando la funzionalità di autoconnect di glade. D'ora in poi cercherò sempre di usare Glade per la parte grafica soltanto, mentre per tutto il resto cercherò di scrivere il codice delle callback manualmente... Lo preferisco.


/* 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 on_risultato1_clicked (GtkWidget *widget, gpointer user_data) {
   GladeXML *self = glade_get_widget_tree(GTK_WIDGET(widget));
   GtkWidget *label = glade_xml_get_widget (self, "label3");
  
   char buffer[50]; 
   int a=2, b=2; 
   g_snprintf(buffer, 49, "%d", a+b);
   //g_snprintf converte l'intero in stringa. E' piu sicuro di usare sprintf.

	
   gtk_label_set_text(GTK_LABEL(label),buffer);	
}

void on_risultato2_clicked (GtkWidget *widget, gpointer user_data) {
   GladeXML *self = glade_get_widget_tree(GTK_WIDGET(widget));
   GtkWidget *label = glade_xml_get_widget (self, "label3");
  
   char buffer[50]; 
   int a=4, b=8; 
   g_snprintf(buffer, 49, "%d", a*b);
	
   gtk_label_set_text(GTK_LABEL(label),buffer);	
}

void on_risultato3_clicked (GtkWidget *widget, gpointer user_data) {
   GladeXML *self = glade_get_widget_tree(GTK_WIDGET(widget));
   GtkWidget *label = glade_xml_get_widget (self, "label3");
  
   char buffer[50]; 
   int a=12, b=4; 
   g_snprintf(buffer, 49, "%d", a/b);
	
   gtk_label_set_text(GTK_LABEL(label),buffer);	
}

void on_info_button_clicked (GtkWidget *widget, gpointer user_data) {
  GtkWidget *window2;
  GladeXML *xml;  
  xml = glade_xml_new ("provaglade4.glade", NULL, NULL);
  glade_xml_signal_autoconnect (xml);
  window2 = glade_xml_get_widget (xml, "window2");
  gtk_widget_show (window2);
}

void on_exit_button_clicked (GtkWidget *widget, gpointer user_data) {
  printf ("Arrivederci!n");
  gtk_main_quit ();
	
}

int main (int argc, char *argv[])
{
	GtkWidget *window1, *widget;
	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 ("provaglade4.glade", NULL, NULL);
	
    // Questo servirebbe a fare in modo di modificare tutti i caratteri 
    //della finestra (escludendo la scelta di default fatta dall'utente 
	//nelle impostazioni di GNOME. In realtà è preferibile che sia l'utente 
	//a scegliere il carattere che preferisce.
	//g_object_set(gtk_settings_get_default(), "gtk-font-name", "Sans 20", NULL);

//gtk_label_set_use_markup(label, TRUE); gtk_label_set_markup(label, "<b>Your label</b>");
	
	
	/* This is important */
	glade_xml_signal_autoconnect (xml);
	window1 = glade_xml_get_widget (xml, "window1");
	gtk_widget_show (window1);
	
	/* Chiusura del programma quando l'utente chiude la finestra */
    widget = glade_xml_get_widget (xml, "window1");
    g_signal_connect (G_OBJECT (widget), "delete_event",
                    G_CALLBACK (gtk_main_quit), NULL);

	gtk_main ();
	return 0;
}


prova5


Prova5:
- NON usa autoconnect
- Mostra come cambiare il testo in una GtkLabel (senza usare autoconnect).
- Mostra come prendere un file mediante il gtk_file_chooser_dialog.


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

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

void
on_button1_clicked (GtkButton *button, gpointer user_data)
{
	GtkWidget *window1;
	window1 = gtk_widget_get_toplevel(button);
	
	char *filename;
	
	GtkWidget *dialog;

   dialog = gtk_file_chooser_dialog_new ("Open File",
				      window1,
				      GTK_FILE_CHOOSER_ACTION_OPEN,
				      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
				      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
				      NULL);

   if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
     {
       //char *filename;

       filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
       //open_file (filename);
       // g_free (filename);
     }
   else filename = "";
	
   gtk_widget_destroy (dialog);
	
	/*  Ho preferito ricercare la GtkLabel a partire da window1, per esigenze di esperimento, 
	*   ma avrei potuto direttamente scrivere:
	*   GladeXML *self = glade_get_widget_tree(GTK_WIDGET(button));
    */
    GladeXML *self = glade_get_widget_tree(GTK_WIDGET(window1));
	GtkWidget *label = glade_xml_get_widget (self, "etichetta");
	gtk_label_set_markup (GTK_LABEL(label), filename);
    return 0;  
}

int main (int argc, char *argv[])
{
	GtkWidget *window1, *button1;
	GladeXML *xml;
	
    // PACKAGE è definito in config.h
	gnome_init (PACKAGE, VERSION, argc, argv);
	glade_gnome_init ();
	
	xml = glade_xml_new ("scelta_file.glade", NULL, NULL);

	/* Ho ESCLUSO l'autoconnect, faccio le callback manualmente */
	// glade_xml_signal_autoconnect (xml);
	window1 = glade_xml_get_widget (xml, "window1");

	button1 = glade_xml_get_widget (xml, "button1");

	g_signal_connect (G_OBJECT (button1), "clicked",
                    G_CALLBACK (on_button1_clicked),
                    NULL);

  g_signal_connect (G_OBJECT (window1), "delete_event",
                    G_CALLBACK (gtk_main_quit), NULL);
	
	
	gtk_widget_show (window1);

	gtk_main ();
	return 0;
}

attention.gif Piccola chicca che ancora devo provare: se volete che la vostra interfaccia vi permetta di selezionare directory e NON files, sostituite GTK_FILE_CHOOSER_ACTION_OPEN con GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER

Descrizioni usate nelle foto: 
Postato da: Etnablog in Programmazione C alle 0:40

Permalink | Commenti(1)
Inserisci commento

Commenti:

Sei un Bomber...!
ho quasi capito come funziona il tutto con i programmi di esempio

 

Postato da: roberto il 03 Febbraio 2009 alle 17:36

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