17319
Commento:
|
17446
nome più appropriato
|
Le cancellazioni sono segnalate in questo modo. | Le aggiunte sono segnalate in questo modo. |
Linea 1: | Linea 1: |
## page was renamed from Programmazione/Python/GUI | |
Linea 4: | Linea 5: |
||<tablestyle="float:right; font-size: 0.9em; width:40%; background:#F1F1ED; margin: 0 0 1em 1em;" style="padding:0.5em;">[[TableOfContents]]|| | ||<tablestyle="float:right; font-size: 0.9em; width:35%; background:#F1F1ED; margin: 0 0 1em 1em;" style="padding:0.5em;">'''Indice'''[[BR]][[TableOfContents(1)]]|| |
Linea 411: | Linea 412: |
---- CategoryProgrammazione CategoryDaRevisionare |
IndiceBRTableOfContents(1) |
Introduzione
Esistono gran numero di toolkit (insieme di strumenti) disponibili per creare interfacce grafiche (GUI) con Python, da Tkinter (compresa nell'installazione di Python) a numerose altre multipiattaforma o specifiche per un certo ambiente.
Tra le più utilizzate citiamo wxPython, PyGTK e PyQt.
Per maggiori informazioni, consultare le [#risorse Risorse].
PyGTK
GTK+ (acronimo che sta per GIMP Tool Kit) è un toolkit per la creazione di interfacce grafiche. Il toolkit è stato progettato inizialmente come ausilio alla programmazione per il programma GIMP ed è diventato una parte fondamentale dell'ambiente GNOME.
PyGTK è un set di moduli che permettono l'interfacciamento tra Python e le librerie GTK, è un toolkit orientato agli oggetti, permette quindi la possibilità di riutilizzo dello stesso codice in più applicazioni. È stato portato ai Python coders da James Henstridge in collaborazione con un team di sviluppatori volontari.
Nell'installazione standard di Ubuntu è già presente tutto il necessario.
Per maggiorni informazioni consultare le [#risorse Risorse].
Esempio di applicazione
Questa è una versione del programma AreaTriangolo2.py, presentato in questa [:LinguaggioPython/Listati#areatraingolo2:pagina], che usa le GTK+:
1 #!/usr/bin/python
2
3 # Importiamo la funzione sqrt (radice quadrata) dal modulo math
4 from math import sqrt
5
6 # Importiamo le librerie per l'interfaccia grafica GTK
7 import pygtk
8 pygtk.require('2.0')
9 import gtk
10
11 # Definiamo una classe Triangolo con tre metodi:
12 # un costruttore, un metodo che calcola il perimetro e uno che calcola l'area del triangolo.
13 class Triangolo:
14
15 # Attributi della classe (le misure dei tre lati)
16 a, b, c = 0, 0, 0
17
18 # Metodo costruttore, in python i costruttori hanno il nome speciale __init__
19 def __init__(self,a,b,c):
20 # Controlliamo se i tre valori dati possono effettivamente
21 #essere le misure dei lati di un triangolo.
22 # Caso contrario solleviamo una bella eccezione!
23 if ((a+b>c) and (a+c>b) and (b+c>a)):
24 self.a=a
25 self.b=b
26 self.c=c
27 else:
28 raise "TriangoloImpossibile" , "I lati non possono formare un triangolo"
29 # abbiamo dato un nome ed un essaggio di errore all'eccezione
30 # Metodo che calcola il perimetro
31 def perimetro(self):
32 return self.a + self.b + self.c
33
34 # Metodo che calcola l'area (tramite formula di Erone)
35 def area(self):
36 p=self.perimetro()/2.0
37 return sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))
38
39 #questa e' la classe che definisce l'interfaccia grafica
40 class Dialogo:
41 def __init__(self):
42 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) # definiamo la finestra
43 self.window.set_title("Calcolo area triangolo")# le diamo in titolo
44 self.window.connect("destroy", self.distruggi) # catturiamo l'evento destroy
45 #(es. la X che chiude la finestra)
46 # e lo indirizziamo a una funzione
47 # che termina il programma
48 self.window.set_resizable(False) # la finestra non e' modificabile in dimensioni
49 self.window.set_position(gtk.WIN_POS_MOUSE) # e compare nell'attuale posizione del muose
50 self.bottone = gtk.Button("Calcolo") # definiamo il bottone calcolo
51 self.bottone.connect("clicked", self.calcola) # catturiamo il click e lo indirizzo
52 # alla funzione che esegue il calcolo
53 self.etichetta1 = gtk.Label("Lato 1 ") # testo che richiede la lunghezza del 1 lato
54 self.entrata1 = gtk.Entry(10) # casella per l'inserimento della lunghezza
55 # del 1 lato
56 self.riga1 = gtk.HBox() # creiamo un contenitore dove
57 # gli oggetti sono disposti in orizzontale (una riga)
58 self.riga1.pack_start(self.etichetta1) # inseriamo l'etichetta e la casella di input nella 1 riga
59 self.riga1.pack_start(self.entrata1)
60 self.etichetta2 = gtk.Label("Lato 2 ") # e cosi' via ...
61 self.entrata2 = gtk.Entry(10)
62 self.riga2 = gtk.HBox()
63 self.riga2.pack_start(self.etichetta2)
64 self.riga2.pack_start(self.entrata2)
65 self.etichetta3 = gtk.Label("Lato 3 ")
66 self.entrata3 = gtk.Entry(10)
67 self.riga3 = gtk.HBox()
68 self.riga3.pack_start(self.etichetta3)
69 self.riga3.pack_start(self.entrata3)
70 self.risultato = gtk.Label(" -- ") # creiamo un'etichetta per il risultato
71 self.colonna = gtk.VBox() # creiamo un contenitore dove
72 # gli oggetti sono disposti in verticale (una colonna)
73 self.colonna.pack_start(self.riga1) # e vi inseriamo le righe, il pulsante e l'etichetta del risultato
74 self.colonna.pack_start(self.riga2)
75 self.colonna.pack_start(self.riga3)
76 self.colonna.pack_start(self.bottone)
77 self.colonna.pack_start(self.risultato)
78 self.window.add(self.colonna) # inseriamo il tutto nella finestra
79 self.window.show_all() # comando che visualizza la finestra ed il suo contenuto
80
81 # funzione che raccoglie gli input, crea un'istanza Triangolo e ne richiede il calcolo dell'area
82 def calcola(self, widget,data = None):
83 try:
84 a = float(self.entrata1.get_text()) # legge i dati inseriti nella 1 casella
85 b = float(self.entrata2.get_text())
86 c = float(self.entrata3.get_text())
87 triangolo = Triangolo(a, b, c)
88 self.risultato.set_text(str(triangolo.area()))
89 except ValueError: # catturo l'eccezione
90 self.risultato.set_text("Devi inserire valori numerici.")
91 except "TriangoloImpossibile": # catturo la seconda eccezione
92 self.risultato.set_text("I lati immessi non possono formare un triangolo")
93 # funzione di uscita
94 def distruggi(self, widget,data = None):
95 print data
96 return gtk.main_quit()
97 # funzione di lancio della GUI
98 def main(self):
99 gtk.main()
100
101 # avvio del programma a condizione che non sia caricato come modulo
102 print __name__
103 if __name__ == "__main__":
104 base = Dialogo()
105 base.main()
Listato del programma AreaTriangolo2.py con interfaccia grafica GTK+BR
Tkinter
Tk è un piccolo toolkit per la creazione di GUI scritto originariamente da John Ousterhout come estensione per il linguaggio Tcl. È stato successivamente portato anche verso altri linguaggi (Python, Ruby, Lisp, ...). Tkinter è il modulo Python che permette l'interfacciamento con Tk.
Per maggiorni informazioni consultare le [#risorse Risorse].
Esempio di applicazione
Presentiamo il solito programma dimostrativo che calcola l'area di un triangolo.
1 #!/usr/bin/python
2
3 # Importiamo la funzione sqrt (radice quadrata) dal modulo math
4 from math import sqrt
5 # Importiamo i widgets dal modulo Tkinter
6 from Tkinter import *
7
8 # Definiamo una classe Triangolo con tre metodi:
9 # un costruttore, un metodo che calcola il perimetro e uno che calcola l'area del triangolo.
10 class Triangolo:
11
12 # Attributi della classe (le misure dei tre lati)
13 a, b, c = 0, 0, 0
14
15 # Metodo costruttore
16 def __init__(self,a,b,c):
17 # Controlliamo se i tre valori dati possono effettivamente essere le misure dei lati di un triangolo.
18 # Caso contrario solleviamo una bella eccezione!
19 if ((a+b>c) and (a+c>b) and (b+c>a)):
20 self.a=a
21 self.b=b
22 self.c=c
23 else:
24 # abbiamo dato un nome ed un essaggio di errore all'eccezione
25 raise "TriangoloImpossibile" , "I lati non possono formare un triangolo"
26
27 # Metodo che calcola il perimetro
28 def perimetro(self):
29 return self.a + self.b + self.c
30
31 # Metodo che calcola l'area (tramite formula di Erone)
32 def area(self):
33 p=self.perimetro()/2.0
34 return sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))
35
36
37 # questa e' la classe che definisce l'interfaccia grafica
38 class Dialogo(Frame):
39
40 def __init__(self):
41 Frame.__init__(self)
42 self.master.title("Area triangolo.") # Diamo il titolo alla finestra.
43 self.master.minsize(250,150) # Dimensioni minime della finestra
44 self.grid(sticky=E+W+N+S)
45
46 self.ris=StringVar() # Questa variabile stringa viene usata per
47 self.ris.set("---") # aggiornare la gui quando il risultato cambia.
48
49 # Rendiamo ridimensionabile la finestra dell'applicazione
50 top=self.winfo_toplevel()
51 top.rowconfigure(0, weight=1)
52 top.columnconfigure(0, weight=1)
53
54 for i in range(5): self.rowconfigure(i, weight=1)
55 self.columnconfigure(1, weight=1)
56
57
58 self.etichetta1=Label(self, text="Lato 1 ") # Etichetta del lato 1
59 self.etichetta1.grid(row=0, column=0, padx=2)
60
61 self.entrata1=Entry(self) # Casella d'inserimento del lato 1
62 self.entrata1.grid(row=0, column=1, pady=2, padx=2, sticky=E+W+N+S)
63
64 self.etichetta2=Label(self, text="Lato 2 ") # Etichetta del lato 2
65 self.etichetta2.grid(row=1, column=0, padx=2)
66
67 self.entrata2=Entry(self) # Casella d'inserimento del lato 2
68 self.entrata2.grid(row=1, column=1, pady=2, padx=2, sticky=E+W+N+S)
69
70 self.etichetta3=Label(self, text="Lato 3 ") # Etichetta del lato 3
71 self.etichetta3.grid(row=2, column=0, padx=2)
72
73 self.entrata3=Entry(self) # Casella d'inserimento del lato 3
74 self.entrata3.grid(row=2, column=1, pady=2, padx=2, sticky=E+W+N+S)
75
76 self.bottone=Button(self, text="Calcola", command=self.calcola) # Bottone "Calcola"
77 self.bottone.grid(row=3, column=0, columnspan=2, pady=2, padx=2, sticky=E+W+N+S)
78
79 self.risultato=Label(self, textvariable=self.ris) # Testo che motra il risultato.
80 self.risultato.grid(row=4, column=0, columnspan=2, pady=2, padx=2, sticky=E+W+N+S)
81
82
83 # Raccogliamo l'input e calcoliamo l'area
84 def calcola(self):
85 try :
86 a=float(self.entrata1.get())
87 b=float(self.entrata2.get())
88 c=float(self.entrata3.get())
89 t=Triangolo(a,b,c)
90 self.ris.set("Area = "+str(t.area()))
91 except ValueError: self.ris.set("Devi inserire valori numerici.")
92 except "TriangoloImpossibile": self.ris.set("I lati immessi non possono formare un triangolo")
93
94
95 # Avvio del programma a condizione che non sia caricato come modulo
96 if __name__=="__main__":
97 d=Dialogo()
98 d.mainloop()
wxPython
BR Questa è una versione del programma AreaTriangolo2.py, presentato in questa [:LinguaggioPython/Listati#areatraingolo2:pagina], che utilizza le librerie wxpython.
Esempio di applicazione
1 #!/usr/bin/python
2
3 import wx #importiamo l'interfaccia grafica
4
5 from string import digits # importiamo una variabile per il controllo dei dati in input
6 from math import sqrt # importiamo la funzione sqrt per il calcolo della radicequadrata dal modulo math
7
8 class Finestra(wx.Frame):
9 #inizializza la finestra grafica
10 def __init__(self,parent,id=-1,title='',pos = wx.Point(0,0),size = wx.Size(400,300),style = wx.DEFAULT_FRAME_STYLE,name = 'frame'):
11 pre=wx.PreFrame()
12 pre.Create(parent,id,title,pos,size,style,name)
13 self.this = pre.this
14 self.VwXinit()
15
16 #quando si clicca X [angolo superiore destro della finestra] per chiudere la finestra
17 def __del__(self):
18 self.Ddel()
19 return
20
21 #definizione della presentazione della finestra e dei suoi oggetti interni
22 def VwXinit(self):
23 self.SetTitle("Finestra principale ") # titolo della finestra
24
25 self.SetFont(wx.Font(11,74,90,90,0,"Modern No. 20"))
26 self.StBar = self.CreateStatusBar(1,wx.ST_SIZEGRIP)
27 self.StBar.SetStatusWidths([-1])
28 self.StBar.SetStatusText("Calcolo dell'area di un triangolo noti i lati",0)
29 self.StBar.SetForegroundColour(wx.RED)
30 self.SetBackgroundColour(wx.GREEN)
31 self.st1 = wx.StaticText(self,-1,"Calcolo Area del Triangolo formula Erone ",wx.Point(20,30),wx.Size(400,30))
32
33 self.st1.SetFont(wx.Font(11,74,90,90,0,"Modern No. 20"))
34 self.st1.SetForegroundColour(wx.RED)
35 self.lato1 = wx.StaticText(self, -1, "Inserisci il 1 Lato [1..9] :",wx.Point(10,63))
36 self.latoa = wx.TextCtrl(self, -1, "", wx.Point(200, 60), wx.Size(100,-1))
37
38 self.lato2 = wx.StaticText(self, -1, "Inserisci il 2 Lato [1..9] :",wx.Point(10,93))
39 self.latob = wx.TextCtrl(self, -1, "", wx.Point(200, 90), wx.Size(100,-1))
40
41 self.lato3 = wx.StaticText(self, -1, "Inserisci il 3 Lato [1..9] :",wx.Point(10,123))
42 self.latoc = wx.TextCtrl(self, -1, "", wx.Point(200, 120), wx.Size(100,-1))
43
44 self.bt1 = wx.Button(self,-1,"",wx.Point(155,220),wx.Size(90,30))
45 self.bt1.SetLabel('Inserisci')
46 self.bt1.SetFont(wx.Font(12,74,90,90,0,"Modern No. 20"))
47 self.bt1.SetForegroundColour(wx.Colour(0,130,255))
48
49 wx.EVT_BUTTON(self.bt1,-1,self.Acquisisci) #manda in esecuzione i controlli e
50 # se superati calcola l'area
51
52 return
53 #acquisisce i dati inseriti li controlla e se puo' calcola l'area
54 def Acquisisci(self,event):
55 a=str(self.latoa.GetValue())
56 b=str(self.latob.GetValue())
57 c=str(self.latoc.GetValue())
58
59 vero = Finestra.Contronum(self,a)
60 if vero == "F":
61 avviso = "Il lato a ="+ a+" <-- non e' di tipo numerico; Riprova "
62 msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR)
63 return
64 vero = Finestra.Contronum(self,b)
65 if vero == "F":
66 avviso = "Il lato b ="+ b+" <-- non e' di tipo numerico; Riprova "
67 msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR)
68 return
69 vero =Finestra.Contronum(self,c)
70 if vero == "F":
71 avviso = "Il lato c ="+ c+" <-- non e' di tipo numerico; Riprova "
72 msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR)
73 return
74 # li trasforma in virgola mobile e poi verifica che corrispondano ad un triangolo
75 a= float(a)
76 b=float(b)
77 c=float(c)
78
79 p = (a+b+c)/2.0
80
81 if p <=a or p <= b or p <= c:
82 avviso ='I dati immessi non sono quelli di un triangolo; Riprova'
83 msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR)
84 return
85 else:
86 # calcolo area triangolo
87 area =sqrt(p*(p-a)*(p-b)*(p-c))
88 avviso =" L'area del triangolo misura Mq "+str(area)
89 msg = wx.MessageBox( avviso, 'Risultato',wx.OK )
90
91 return
92
93 def Contronum(self,valore): # serve per la verifica che i dati immessi siano di tipo numerico
94
95 vero = "F"
96 for i in range(len(valore)):
97
98 if valore[i] in digits :
99
100 vero = "T"
101
102 continue
103
104 else:
105
106 vero = "F"
107
108 break
109 return vero
110
111 def Ddel(self): #serve per la chiusura della finestra
112
113 return
114
115
116
117 class App(wx.App):# finestra da cui derivano tutte le finestre successive
118 def OnInit(self):
119
120 self.main = Finestra(None,-1,'')
121 self.main.Show()
122
123 return 1
124
125 def main():#lancia il programma in quanto non caricato come modulo
126
127 application = App(0)
128 application.MainLoop()
129
130 if __name__ == '__main__':
131 main()
Listato del programma AreaTriangolo2.py con interfaccia grafica wxPython BR Anchor(risorse)
Risorse
[http://wiki.python.org/moin/GuiProgramming] BR Programmare interfacce grafiche con Python.
[http://www.wxpython.org] BR Sito ufficiale di wxpython
[http://www.pygtk.org/] BR Sito ufficiale di PyGTK.
[http://www.parafernalia.org/pygtk/] BR Documentazione in italiano di PyGTK.
[http://www.tcl.tk/] BR Sito degli sviluppatori tcl/tk
[http://www.python.it/] BR Il sito di riferimento per i programmatori python italiani! Qui potete trovare le traduzioni in italiano della documentazione ufficiale nonchè le FAQ sul linguaggio.
[http://www.python.org/] BR Il sito ufficiale del linguaggio python. Trovate la documentazione in inglese aggiornata all'ultima versione dell'interprete, in più tutte le novità e le iniziative che ruotano intorno a questo linguaggio.