Python GUI
Ci sono un gran numero di toolkit disponibili per creare interfacce grafiche (GUI) con Python, da Tkinter (già compresa nella installazione di Python che consente l'interfaccia con X-Windows) a numerose altre multipiattaforma o specifiche per un certo ambiente.
Tra le più utilizzate citiamo wxPython, PyGTK e PyQt, ma altre possiamo trovarle qui:
http://wiki.python.org/moin/GuiProgramming
PyGTK
GTK+ (acronimo che sta per GIMP Tool Kit) è un toolkit (insieme di strumenti) per la creazione di interfacce grafiche. Il toolkit è stato progettato inizialmente come ausilio alla programmazione per il programma GIMP è diventato una parte fondamentale dell'ambiente GNOME.
PyGTK è un set di moduli che permettono l'interfaccia tra Python e le librerie GTK, è un toolkit orientato agli oggetti, permette quindi la possibilità di riusare lo stesso codice in più applicazioni, è stato portato ai Python coders da James Henstridge in collaborazione con un team di developers volontari. Nell'installazione standard di Ubuntu è già presente tutto il necessario.
Il sito ufficiale (in inglese) di PyGTK e':
La documentazione in italiano si trova qui:
http://www.parafernalia.org/pygtk/
Esempio di applicazione
Questa è una versione del programma AreaTriangolo2.py del wiki LinguaggioPython che usa le GUI GTK+:
1 #!/usr/bin/python
2
3 # Importiamo la funzione sqrt (radice quadrata) dal modulo math
4 from math import sqrt
5 # Importiamo le librerie per l'interfaccia grafica GTK
6 import pygtk
7 pygtk.require('2.0')
8 import gtk
9
10 # Definiamo una classe Triangolo con tre metodi:
11 # un costruttore, un metodo che calcola il perimetro e uno che calcola l'area del triangolo.
12 class Triangolo:
13
14 # Attributi della classe (le misure dei tre lati)
15 a, b, c = 0, 0, 0
16
17 # Metodo costruttore, in python i costruttori hanno il nome speciale __init__
18 def __init__(self,a,b,c):
19 # Controlliamo se i tre valori dati possono effettivamente
20 #essere le misure dei lati di un triangolo.
21 # Caso contrario solleviamo una bella eccezione!
22 if ((a+b>c) and (a+c>b) and (b+c>a)):
23 self.a=a
24 self.b=b
25 self.c=c
26 else:
27 raise "TriangoloImpossibile" , "I lati non possono formare un triangolo"
28 # abbiamo dato un nome ed un essaggio di errore all'eccezione
29 # Metodo che calcola il perimetro
30 def perimetro(self):
31 return self.a + self.b + self.c
32
33 # Metodo che calcola l'area (tramite formula di Erone)
34 def area(self):
35 p=self.perimetro()/2.0
36 return sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))
37
38 #questa e' la classe che definisce l'interfaccia grafica
39 class Dialogo:
40 def __init__(self):
41 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) # definiamo la finestra
42 self.window.set_title("Calcolo area triangolo")# le diamo in titolo
43 self.window.connect("destroy", self.distruggi) # catturiamo l'evento destroy
44 #(es. la X che chiude la finestra)
45 # e lo indirizziamo a una funzione
46 # che termina il programma
47 self.window.set_resizable(False) # la finestra non e' modificabile in dimensioni
48 self.window.set_position(gtk.WIN_POS_MOUSE) # e compare nell'attuale posizione del muose
49 self.bottone = gtk.Button("Calcolo") # definiamo il bottone calcolo
50 self.bottone.connect("clicked", self.calcola) # catturiamo il click e lo indirizzo
51 # alla funzione che esegue il calcolo
52 self.etichetta1 = gtk.Label("Lato 1 ") # testo che richiede la lunghezza del 1 lato
53 self.entrata1 = gtk.Entry(10) # casella per l'inserimento della lunghezza
54 # del 1 lato
55 self.riga1 = gtk.HBox() # creiamo un contenitore dove
56 # gli oggetti sono disposti in orizzontale (una riga)
57 self.riga1.pack_start(self.etichetta1) # inseriamo l'etichetta e la casella di input nella 1 riga
58 self.riga1.pack_start(self.entrata1)
59 self.etichetta2 = gtk.Label("Lato 2 ") # e cosi' via ...
60 self.entrata2 = gtk.Entry(10)
61 self.riga2 = gtk.HBox()
62 self.riga2.pack_start(self.etichetta2)
63 self.riga2.pack_start(self.entrata2)
64 self.etichetta3 = gtk.Label("Lato 3 ")
65 self.entrata3 = gtk.Entry(10)
66 self.riga3 = gtk.HBox()
67 self.riga3.pack_start(self.etichetta3)
68 self.riga3.pack_start(self.entrata3)
69 self.risultato = gtk.Label(" -- ") # creiamo un'etichetta per il risultato
70 self.colonna = gtk.VBox() # creiamo un contenitore dove
71 # gli oggetti sono disposti in verticale (una colonna)
72 self.colonna.pack_start(self.riga1) # e vi inseriamo le righe, il pulsante e l'etichetta del risultato
73 self.colonna.pack_start(self.riga2)
74 self.colonna.pack_start(self.riga3)
75 self.colonna.pack_start(self.bottone)
76 self.colonna.pack_start(self.risultato)
77 self.window.add(self.colonna) # inseriamo il tutto nella finestra
78 self.window.show_all() # comando che visualizza la finestra ed il suo contenuto
79
80 # funzione che raccoglie gli input, crea un'istanza Triangolo e ne richiede il calcolo dell'area
81 def calcola(self, widget,data = None):
82 try:
83 a = float(self.entrata1.get_text()) # legge i dati inseriti nella 1 casella
84 b = float(self.entrata2.get_text())
85 c = float(self.entrata3.get_text())
86 triangolo = Triangolo(a, b, c)
87 self.risultato.set_text(str(triangolo.area()))
88 except ValueError: # catturo l'eccezione
89 self.risultato.set_text("Devi inserire valori numerici.")
90 except "TriangoloImpossibile": # catturo la seconda eccezione
91 self.risultato.set_text("I lati immessi non possono formare un triangolo")
92 # funzione di uscita
93 def distruggi(self, widget,data = None):
94 print data
95 return gtk.main_quit()
96 # funzione di lancio della GUI
97 def main(self):
98 gtk.main()
99
100 # avvio del programma a condizione che non sia caricato come modulo
101 print __name__
102 if __name__ == "__main__":
103 base = Dialogo()
104 base.main()
Listato del programma AreaTriangolo2.py con interfaccia grafica GTK+BRBR