In questa versione dell'esempio di GUI l'interfaccia non e' stata creata da codice bensi' mediante il GUI Designer di GTK ovvero Glade
Per iniziare a creare l'interfaccia deve essere prima aggiunto una form (ovvero un TopLevel) a cui deve essere aggiunta una Box (in questo caso un VBox) per impacchettare i Widgets e successivamente si aggiungono i Widgets
Il nome della finestra di TopLevel e' stato definito come MainWindow (nome che servira' per la referenziazione)
In Properties/Signal si puo' definire l'evento che si vuole catturare
Il salvataggio dell'interfaccia puo' avvenire in due formati (GtkBuilder e Libglade). Nell'esempio riportato di seguito e' stato scelto LibGlade
Il programma in Python...il codice e' abbastanza autoesplicativo
---------------------------------------------------
import sys
try:
import pygtk
pygtk.require("2.0")
except:
pass
try:
import gtk
import gtk.glade
except:
sys.exit(1)
class ProgressBar:
def __init__(self):
self.gladefile = "progressbar.glade"
self.wTree = gtk.glade.XML(self.gladefile)
self.window = self.wTree.get_widget("MainWindow")
self.window.show()
if (self.window):
self.window.connect("destroy", gtk.main_quit)
dic = { "on_hscale1_value_changed" : self.cambia_valore}
self.wTree.signal_autoconnect(dic)
def cambia_valore(self, widget):
a = self.wTree.get_widget("hscale1").get_value()
self.wTree.get_widget("label1").set_text(str(int(a)))
self.wTree.get_widget("progressbar1").set_fraction(a/100)
if __name__ == "__main__":
hwg = ProgressBar()
gtk.main()
---------------------------------------------------
progressbar.glade
---------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<glade-interface>
<!-- interface-requires gtk+ 2.24 -->
<!-- interface-naming-policy project-wide -->
<widget class="GtkWindow" id="MainWindow">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Progress Bar</property>
<property name="default_width">250</property>
<property name="default_height">80</property>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<widget class="GtkHScale" id="hscale1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">0 0 110 1 1 10</property>
<property name="lower_stepper_sensitivity">off</property>
<property name="upper_stepper_sensitivity">off</property>
<property name="restrict_to_fill_level">False</property>
<property name="round_digits">1</property>
<property name="digits">0</property>
<property name="draw_value">False</property>
<signal name="change_value" handler="on_hscale1_change_value" swapped="no"/>
<signal name="value_changed" handler="on_hscale1_value_changed" swapped="no"/>
</widget>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<widget class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">0</property>
</widget>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<widget class="GtkProgressBar" id="progressbar1">
<property name="visible">True</property>
<property name="can_focus">False</property>
</widget>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>
---------------------------------------------------
lunedì 27 agosto 2012
Esempio Gui in Lazarus/Pascal
Per gli esempi delle GUI su Linux stavo cercando di ritirare fuori Kylix (che esisteva anche in versione Open Edition oltre che commerciale) quando mi sono accorto che e' un prodotto praticamente defunto
In ogni caso esiste un sostituto che ne mima le funzionalita', l'interfaccia ed il linguaggio ovvero Lazarus Pascal
La differenza principali nell'Editor di Gui e' che i widgets non si trascinano sul Form ma si deve cliccare sulla toolbar per selezionare il widget e poi cliccare sul Form per inserirlo
Per la gestione degli eventi si usa il tab vicino alle proprieta' del widget, si seleziona l'evento e si apre l'editor di codice che nel caso in esame e' particolarmente semplice
--------------------------------------
ProgressBa1.position = TrackBar1.Position;
Label1.Caption = IntToStr(TrackBar1.Position);
--------------------------------------
In ogni caso esiste un sostituto che ne mima le funzionalita', l'interfaccia ed il linguaggio ovvero Lazarus Pascal
La differenza principali nell'Editor di Gui e' che i widgets non si trascinano sul Form ma si deve cliccare sulla toolbar per selezionare il widget e poi cliccare sul Form per inserirlo
Schermata dell'IDE di Lazarus |
--------------------------------------
ProgressBa1.position = TrackBar1.Position;
Label1.Caption = IntToStr(TrackBar1.Position);
--------------------------------------
Esempio Gui in Mono/C#
La GUI di esempio scritta in C# Mono
Per Debian e' sufficiente installare il pacchetto mono-complete che aggiunge anche l'IDE MonoDevelop
Una prima osservazione: in MonoDevelop i progetti si chiamano soluzioni per cui per creare un progetto si deve creare una soluzione
qwe
Il Designer della GUI si trova nella Interfaccia Utente della Soluzione
Per creare l'evento da associare al Widget si deve cliccare sul Menu' a scomparsa sulla sinistra Proprieta' e, dopo aver selezionato il Widget, si clicca il tab Segnali (dove solo elencati i segnali specifici del widget sia quelli ereditati)
Cliccando sul segnale richiesto si apre l'editor si apre l'editor del codice in cui e' stato inserito
---------------------------------------------
double t = hscale1.Value;
string s = System.Convert.ToString(t) ;
label1.Text = s;
progressbar1.Fraction = t/100;
---------------------------------------------
Per Debian e' sufficiente installare il pacchetto mono-complete che aggiunge anche l'IDE MonoDevelop
Una prima osservazione: in MonoDevelop i progetti si chiamano soluzioni per cui per creare un progetto si deve creare una soluzione
qwe
Il Designer della GUI si trova nella Interfaccia Utente della Soluzione
Gui Designer di Mono Develop |
Per creare l'evento da associare al Widget si deve cliccare sul Menu' a scomparsa sulla sinistra Proprieta' e, dopo aver selezionato il Widget, si clicca il tab Segnali (dove solo elencati i segnali specifici del widget sia quelli ereditati)
Cliccando sul segnale richiesto si apre l'editor si apre l'editor del codice in cui e' stato inserito
---------------------------------------------
double t = hscale1.Value;
string s = System.Convert.ToString(t) ;
label1.Text = s;
progressbar1.Fraction = t/100;
---------------------------------------------
Esempio GUI con GTK in C
Per creare la GUi viene impiegata la libreria GTK senza l'impiego di Glade (ovvero in GUI Designer di GTK)
Impiegando Code::Block e scegliendo il progetto GTK non e' necessario impostare le flag del compilatore che vengono aggiunte in automatico dall'IDE per cui e' molto semplice giungere ad un eseguibile
Compilare l'esempio seguente con Eclipse e' decisamente piu' complicato
Una delle principali differenze rispetto a Qt risiede nel fatto che GTK e' completamente in C (ha una interfaccia in C++ ma solo come wrapper) per cui la gestione degli oggetti non esiste in modo tradizionale. Inoltre per aggiungere una azione ad un widget si usa signal connect
--------------------------------------------------
#include <stdlib.h>
#include <gtk/gtk.h>
#include <stdio.h>
GtkWidget *scale = NULL;
GtkWidget *label = NULL;
GtkWidget *progressbar= NULL;
static void cambia_valore (GtkWidget *wid, GtkWidget *win)
{
gdouble current_value = gtk_range_get_value(GTK_RANGE(scale));
char buffer [14] = { '\0' };
sprintf ( buffer, "%.0f", current_value);
gtk_label_set_text(label,buffer);
gtk_progress_bar_set_fraction(progressbar,current_value/100);
}
int main (int argc, char *argv[])
{
GtkWidget *win = NULL;
GtkWidget *vbox = NULL;
/* Initialize GTK+ */
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
gtk_init (&argc, &argv);
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);
/* Create the main window */
win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width (GTK_CONTAINER (win), 8);
gtk_window_set_title (GTK_WINDOW (win), "Progress Bar");
gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
gtk_widget_realize (win);
g_signal_connect (win, "destroy", gtk_main_quit, NULL);
/* Create a vertical box with buttons */
vbox = gtk_vbox_new (TRUE, 6);
gtk_container_add (GTK_CONTAINER (win), vbox);
scale = gtk_hscale_new_with_range(0,100,1);
g_signal_connect (G_OBJECT (scale), "value_changed", G_CALLBACK (cambia_valore), (gpointer) win);
gtk_box_pack_start (GTK_BOX (vbox), scale, TRUE, TRUE, 0);
label = gtk_label_new("0");
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
progressbar = gtk_progress_bar_new();
gtk_box_pack_start (GTK_BOX (vbox), progressbar, TRUE, TRUE, 0);
/* Enter the main loop */
gtk_widget_show_all (win);
gtk_main ();
return 0;
}
--------------------------------------------------
nel caso di compilazione a mano si puo' invece da riga di comando indicare
gcc `pkg-config --cflags --libs gtk+-2.0` main.c -o programma
Impiegando Code::Block e scegliendo il progetto GTK non e' necessario impostare le flag del compilatore che vengono aggiunte in automatico dall'IDE per cui e' molto semplice giungere ad un eseguibile
Compilare l'esempio seguente con Eclipse e' decisamente piu' complicato
Una delle principali differenze rispetto a Qt risiede nel fatto che GTK e' completamente in C (ha una interfaccia in C++ ma solo come wrapper) per cui la gestione degli oggetti non esiste in modo tradizionale. Inoltre per aggiungere una azione ad un widget si usa signal connect
--------------------------------------------------
#include <stdlib.h>
#include <gtk/gtk.h>
#include <stdio.h>
GtkWidget *scale = NULL;
GtkWidget *label = NULL;
GtkWidget *progressbar= NULL;
static void cambia_valore (GtkWidget *wid, GtkWidget *win)
{
gdouble current_value = gtk_range_get_value(GTK_RANGE(scale));
char buffer [14] = { '\0' };
sprintf ( buffer, "%.0f", current_value);
gtk_label_set_text(label,buffer);
gtk_progress_bar_set_fraction(progressbar,current_value/100);
}
int main (int argc, char *argv[])
{
GtkWidget *win = NULL;
GtkWidget *vbox = NULL;
/* Initialize GTK+ */
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
gtk_init (&argc, &argv);
g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);
/* Create the main window */
win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width (GTK_CONTAINER (win), 8);
gtk_window_set_title (GTK_WINDOW (win), "Progress Bar");
gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
gtk_widget_realize (win);
g_signal_connect (win, "destroy", gtk_main_quit, NULL);
/* Create a vertical box with buttons */
vbox = gtk_vbox_new (TRUE, 6);
gtk_container_add (GTK_CONTAINER (win), vbox);
scale = gtk_hscale_new_with_range(0,100,1);
g_signal_connect (G_OBJECT (scale), "value_changed", G_CALLBACK (cambia_valore), (gpointer) win);
gtk_box_pack_start (GTK_BOX (vbox), scale, TRUE, TRUE, 0);
label = gtk_label_new("0");
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
progressbar = gtk_progress_bar_new();
gtk_box_pack_start (GTK_BOX (vbox), progressbar, TRUE, TRUE, 0);
/* Enter the main loop */
gtk_widget_show_all (win);
gtk_main ();
return 0;
}
--------------------------------------------------
nel caso di compilazione a mano si puo' invece da riga di comando indicare
gcc `pkg-config --cflags --libs gtk+-2.0` main.c -o programma
domenica 26 agosto 2012
Compilare SDL con Code::Blocks
Per compilare con Code::Blocks programmi con dipendenza in SDL sotto Debian 6.0 e' sufficiente installare mediante apt-get le librerie di sviluppo sotto riportate
libsdl-sound1.2-dev
libsdl1.2-dev
libsdl-image1.2-dev
libsdl-mixer1.2-dev
libsdl-net1.2-dev
libsdl-ttf2.0-dev
libsdl-ttf2.0-dev
venerdì 24 agosto 2012
Webcam ARKMicro
Ho ceduto alla tentazione di comprare su DealExtreme una webcam per circa 4 euro (spedizione compresa).
La descrizione parla di una camera 640x480 con led per illuminazione
Una volta inserita nella Linux Box e' stata immediatamente riconosciuta (temevo il peggio)
-----------------------------------------------------------------------
Aug 24 15:15:41 kranz kernel: [ 5669.032091] usb 2-1: new full speed USB device using uhci_hcd and address 2
Aug 24 15:15:41 kranz kernel: [ 5669.195355] usb 2-1: New USB device found, idVendor=18ec, idProduct=3290
Aug 24 15:15:41 kranz kernel: [ 5669.195369] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Aug 24 15:15:41 kranz kernel: [ 5669.195379] usb 2-1: Product: USB2.0 PC CAMERA
Aug 24 15:15:41 kranz kernel: [ 5669.195386] usb 2-1: Manufacturer: ARKMICRO
Aug 24 15:15:41 kranz kernel: [ 5669.195588] usb 2-1: configuration #1 chosen from 1 choice
Aug 24 15:15:41 kranz kernel: [ 5669.197529] uvcvideo: Found UVC 1.00 device USB2.0 PC CAMERA (18ec:3290)
Aug 24 15:15:41 kranz kernel: [ 5669.200674] input: USB2.0 PC CAMERA as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/input/input11
e qui sono arrivate le sorprese
la webcam e' in realta' una 320x240 di pessima qualita' con dei led nel visibile che sono assolutamente inutili in quanto non riescono ad illuminare in qualsiasi condizioni ambientale (se erano ad infrarossi forse era meglio)
certo che il confronto con la webcam integrata nel portatile 640x480 reali (che pure non e' eccezionale nelle prestazioni soprattutto con poca illumicazione) e' impietoso
certo funzionare funziona e per meno di 4 euro (spedizione compresa) puo' essere anche abbastanza
La descrizione parla di una camera 640x480 con led per illuminazione
Una volta inserita nella Linux Box e' stata immediatamente riconosciuta (temevo il peggio)
-----------------------------------------------------------------------
Aug 24 15:15:41 kranz kernel: [ 5669.032091] usb 2-1: new full speed USB device using uhci_hcd and address 2
Aug 24 15:15:41 kranz kernel: [ 5669.195355] usb 2-1: New USB device found, idVendor=18ec, idProduct=3290
Aug 24 15:15:41 kranz kernel: [ 5669.195369] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Aug 24 15:15:41 kranz kernel: [ 5669.195379] usb 2-1: Product: USB2.0 PC CAMERA
Aug 24 15:15:41 kranz kernel: [ 5669.195386] usb 2-1: Manufacturer: ARKMICRO
Aug 24 15:15:41 kranz kernel: [ 5669.195588] usb 2-1: configuration #1 chosen from 1 choice
Aug 24 15:15:41 kranz kernel: [ 5669.197529] uvcvideo: Found UVC 1.00 device USB2.0 PC CAMERA (18ec:3290)
Aug 24 15:15:41 kranz kernel: [ 5669.200674] input: USB2.0 PC CAMERA as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/input/input11
-----------------------------------------------------------------------
e qui sono arrivate le sorprese
la webcam e' in realta' una 320x240 di pessima qualita' con dei led nel visibile che sono assolutamente inutili in quanto non riescono ad illuminare in qualsiasi condizioni ambientale (se erano ad infrarossi forse era meglio)
certo che il confronto con la webcam integrata nel portatile 640x480 reali (che pure non e' eccezionale nelle prestazioni soprattutto con poca illumicazione) e' impietoso
certo funzionare funziona e per meno di 4 euro (spedizione compresa) puo' essere anche abbastanza
Webcam ARKMicro |
Webcam integrata nel portatile |
giovedì 23 agosto 2012
Esempio GUI con QTCreator
Da non confondersi con QT Designer questo tool e' una IDE integrata per QT e non un semplice disegnatore di interfacce
per creare l'esempio non e' stata scritta una riga di codice. E' stato sufficiente collegare il segnale del sender (in questo caso lo slider) al widget di destinazione (ovvero la label e la progress bar)
per creare l'esempio non e' stata scritta una riga di codice. E' stato sufficiente collegare il segnale del sender (in questo caso lo slider) al widget di destinazione (ovvero la label e la progress bar)
Iscriviti a:
Post (Atom)
Debugger integrato ESP32S3
Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede nell'ID USB della porta Jtag. Nel modulo...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...