|
Dimensione: 16223
Commento:
|
Dimensione: 14203
Commento:
|
| Le cancellazioni sono segnalate in questo modo. | Le aggiunte sono segnalate in questo modo. |
| Linea 7: | Linea 7: |
| <<Informazioni(forum="https://forum.ubuntu-it.org/viewtopic.php?f=46&t=631491"; rilasci="18.04")>> | <<Informazioni(forum="https://forum.ubuntu-it.org/viewtopic.php?f=46&t=638223"; rilasci="18.04 16.04 14.04")>> |
| Linea 11: | Linea 11: |
| All'interno di questa pagina sono presenti degli esempi di come creare delle semplici interfacce grafiche usando programmi come '''wxPython''', '''PyGTK''' e '''!PyQt'''. | All'interno di questa pagina sono presenti degli esempi di come creare delle semplici interfacce grafiche usando programmi come '''wxPython''', '''Tkinter''' e '''PyGTK'''. '''Tkinter''' è di norma preinstallato in '''Ubuntu''', mentre '''wxPython''' può essere installato con: {{{ sudo apt install python3-wxgtk4.0 }}} * tutto ciò che viene scritto preceduto dal carattere # è considerato dall'interprete come un commento. * questi esempii sono scritti per l'interprete '''Python 3.x''' per la guida nella precedente versione '''Python 2.7.xx''', vedi [[Programmazione/Python/InterfacceGrafiche| InterfacceGrafiche]] |
| Linea 15: | Linea 23: |
| GTK+ è un toolkit per la creazione di interfacce grafiche è stato progettato inizialmente come ausilio alla programmazione per [[Grafica/Gimp|GIMP]] ed è diventato una parte fondamentale dell'ambiente [[AmbienteGrafico/Gnome| 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 riutilizzare dello stesso codice in più applicazioni. == Esempio di applicazione == Questa è una versione del programma `AreaTriangolo2.py`, presente all'interno di [[Programmazione/Python/Listati#areatraingolo2| questa pagina]]. |
'''GTK+''' è un toolkit per la creazione di interfacce grafiche è stato progettato inizialmente come ausilio alla programmazione per [[Grafica/Gimp|GIMP]] ed è diventato una parte fondamentale dell'ambiente [[AmbienteGrafico/Gnome| 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 riutilizzare dello stesso codice in più applicazioni. |
| Linea 23: | Linea 28: |
| #!/usr/bin/python # Importiamo la funzione sqrt (radice quadrata) dal modulo math |
import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk |
| Linea 28: | Linea 33: |
| # Importiamo le librerie per l'interfaccia grafica GTK import pygtk pygtk.require('2.0') import gtk # Definiamo una classe Triangolo con tre metodi: # un costruttore, un metodo che calcola il perimetro e uno che calcola l'area del triangolo. |
|
| Linea 36: | Linea 34: |
# Attributi della classe (le misure dei tre lati) |
|
| Linea 50: | Linea 46: |
| raise "TriangoloImpossibile" , "I lati non possono formare un triangolo" | raise "TriangoloImpossibile"("I lati non possono formare un triangolo") |
| Linea 60: | Linea 56: |
#questa e' la classe che definisce l'interfaccia grafica class Dialogo: |
class Finestra(Gtk.Window): |
| Linea 64: | Linea 59: |
| self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) # definiamo la finestra self.window.set_title("Calcolo area triangolo")# le diamo in titolo self.window.connect("destroy", self.distruggi) # catturiamo l'evento destroy #(es. la X che chiude la finestra) # e lo indirizziamo a una funzione # che termina il programma self.window.set_resizable(False) # la finestra non e' modificabile in dimensioni self.window.set_position(gtk.WIN_POS_MOUSE) # e compare nell'attuale posizione del muose self.bottone = gtk.Button("Calcolo") # definiamo il bottone calcolo self.bottone.connect("clicked", self.calcola) # catturiamo il click e lo indirizzo # alla funzione che esegue il calcolo self.etichetta1 = gtk.Label("Lato 1 ") # testo che richiede la lunghezza del 1 lato self.entrata1 = gtk.Entry(10) # casella per l'inserimento della lunghezza # del 1 lato self.riga1 = gtk.HBox() # creiamo un contenitore dove # gli oggetti sono disposti in orizzontale (una riga) self.riga1.pack_start(self.etichetta1) # inseriamo l'etichetta e la casella di input nella 1 riga self.riga1.pack_start(self.entrata1) self.etichetta2 = gtk.Label("Lato 2 ") # e cosi' via ... self.entrata2 = gtk.Entry(10) self.riga2 = gtk.HBox() self.riga2.pack_start(self.etichetta2) self.riga2.pack_start(self.entrata2) self.etichetta3 = gtk.Label("Lato 3 ") self.entrata3 = gtk.Entry(10) self.riga3 = gtk.HBox() self.riga3.pack_start(self.etichetta3) self.riga3.pack_start(self.entrata3) self.risultato = gtk.Label(" -- ") # creiamo un'etichetta per il risultato self.colonna = gtk.VBox() # creiamo un contenitore dove # gli oggetti sono disposti in verticale (una colonna) self.colonna.pack_start(self.riga1) # e vi inseriamo le righe, il pulsante e l'etichetta del risultato self.colonna.pack_start(self.riga2) self.colonna.pack_start(self.riga3) self.colonna.pack_start(self.bottone) self.colonna.pack_start(self.risultato) self.window.add(self.colonna) # inseriamo il tutto nella finestra self.window.show_all() # comando che visualizza la finestra ed il suo contenuto |
Gtk.Window.__init__(self, title = "Calcolo area triangolo") self.riga1 = Gtk.HBox() self.riga2 = Gtk.HBox() self.riga3 = Gtk.HBox() self.colonna = Gtk.VBox() self.label1 = Gtk.Label(label = "Lato 1 ") self.label2 = Gtk.Label(label = "Lato 2 ") self.label3 = Gtk.Label(label = "Lato 3 ") self.entry1 = Gtk.Entry() self.entry2 = Gtk.Entry() self.entry3 = Gtk.Entry() self.button = Gtk.Button(label = "Calcola") self.button.connect("clicked", self.calcola) self.risultato = Gtk.Label(" -- ") self.riga1.pack_start(self.label1, True, True, 0) self.riga1.pack_start(self.entry1, True, True, 0) self.riga2.pack_start(self.label2, True, True, 0) self.riga2.pack_start(self.entry2, True, True, 0) self.riga3.pack_start(self.label3, True, True, 0) self.riga3.pack_start(self.entry3, True, True, 0) |
| Linea 103: | Linea 84: |
| # funzione che raccoglie gli input, crea un'istanza Triangolo e ne richiede il calcolo dell'area def calcola(self, widget,data = None): |
self.colonna.pack_start(self.riga1, True, True, 7) self.colonna.pack_start(self.riga2, True, True, 7) self.colonna.pack_start(self.riga3, True, True, 7) self.colonna.pack_start(self.risultato, True, True, 0) self.colonna.pack_start(self.button, True, True, 3) self.add(self.colonna) def calcola(self, widget): |
| Linea 106: | Linea 96: |
| a = float(self.entrata1.get_text()) # legge i dati inseriti nella 1 casella b = float(self.entrata2.get_text()) c = float(self.entrata3.get_text()) |
a = float(self.entry1.get_text()) # legge i dati inseriti nella 1 casella b = float(self.entry2.get_text()) c = float(self.entry3.get_text()) |
| Linea 115: | Linea 105: |
| # funzione di uscita def distruggi(self, widget,data = None): print data return gtk.main_quit() # funzione di lancio della GUI def main(self): gtk.main() # avvio del programma a condizione che non sia caricato come modulo print __name__ if __name__ == "__main__": base = Dialogo() base.main() }}} ''Listato del programma Area``Triangolo2.py con interfaccia grafica GTK+'' <<BR>> |
win = Finestra() win.connect("destroy", Gtk.main_quit) win.set_resizable(False) #win.set_default_size(100,120) win.show_all() Gtk.main() }}} |
| Linea 134: | Linea 119: |
| Tk è un piccolo toolkit per la creazione d'interfacce grafiche è stato successivamente portato anche verso altri linguaggi (Python, Ruby, Lisp, ...). Tkinter è il modulo Python che permette l'interfacciamento con Tk. | '''Tk''' è un piccolo toolkit per la creazione di interfacce grafiche è stato successivamente portato anche verso altri linguaggi come '''Python''', '''Ruby''', '''Lisp''', ecc.. '''Tkinter''' è il modulo '''Python''' che permette l'interfacciamento con '''Tk'''. |
| Linea 140: | Linea 125: |
| #!/usr/bin/python | #!/usr/bin/python3 |
| Linea 145: | Linea 130: |
| from Tkinter import * | from tkinter import * |
| Linea 164: | Linea 149: |
| raise "TriangoloImpossibile" , "I lati non possono formare un triangolo" | raise "TriangoloImpossibile"("I lati non possono formare un triangolo") |
| Linea 241: | Linea 226: |
| Questa è una versione del programma `AreaTriangolo2.py`, presente all'interno di [[Programmazione/Python/Listati#areatraingolo2| questa pagina]], che utilizza le librerie '''wxpython'''. | Questa è una versione del programma `AreaTriangolo2.py`, presente all'interno di [[Programmazione/Python/ListatiPython3#areatraingolo2| questa pagina]], che utilizza le librerie '''wxpython'''. |
| Linea 244: | Linea 230: |
| Linea 246: | Linea 231: |
| #!/usr/bin/python | #!/usr/bin/python3 |
| Linea 253: | Linea 238: |
| class Finestra(wx.Frame): #inizializza la finestra grafica def __init__(self,parent,id=-1,title='',pos = wx.Point(0,0),size = wx.Size(400,300),style = wx.DEFAULT_FRAME_STYLE,name = 'frame'): pre=wx.PreFrame() pre.Create(parent,id,title,pos,size,style,name) self.this = pre.this self.VwXinit() #quando si clicca X [angolo superiore destro della finestra] per chiudere la finestra def __del__(self): self.Ddel() return #definizione della presentazione della finestra e dei suoi oggetti interni def VwXinit(self): self.SetTitle("Finestra principale ") # titolo della finestra self.SetFont(wx.Font(11,74,90,90,0,"Modern No. 20")) self.StBar = self.CreateStatusBar(1,wx.ST_SIZEGRIP) self.StBar.SetStatusWidths([-1]) self.StBar.SetStatusText("Calcolo dell'area di un triangolo noti i lati",0) self.StBar.SetForegroundColour(wx.RED) self.SetBackgroundColour(wx.GREEN) self.st1 = wx.StaticText(self,-1,"Calcolo Area del Triangolo formula Erone ",wx.Point(20,30),wx.Size(400,30)) self.st1.SetFont(wx.Font(11,74,90,90,0,"Modern No. 20")) self.st1.SetForegroundColour(wx.RED) self.lato1 = wx.StaticText(self, -1, "Inserisci il 1 Lato [1..9] :",wx.Point(10,63)) self.latoa = wx.TextCtrl(self, -1, "", wx.Point(200, 60), wx.Size(100,-1)) self.lato2 = wx.StaticText(self, -1, "Inserisci il 2 Lato [1..9] :",wx.Point(10,93)) self.latob = wx.TextCtrl(self, -1, "", wx.Point(200, 90), wx.Size(100,-1)) self.lato3 = wx.StaticText(self, -1, "Inserisci il 3 Lato [1..9] :",wx.Point(10,123)) self.latoc = wx.TextCtrl(self, -1, "", wx.Point(200, 120), wx.Size(100,-1)) self.bt1 = wx.Button(self,-1,"",wx.Point(155,220),wx.Size(90,30)) self.bt1.SetLabel('Inserisci') self.bt1.SetFont(wx.Font(12,74,90,90,0,"Modern No. 20")) self.bt1.SetForegroundColour(wx.Colour(0,130,255)) wx.EVT_BUTTON(self.bt1,-1,self.Acquisisci) #manda in esecuzione i controlli e # se superati calcola l'area return #acquisisce i dati inseriti li controlla e se puo' calcola l'area def Acquisisci(self,event): a=str(self.latoa.GetValue()) b=str(self.latob.GetValue()) c=str(self.latoc.GetValue()) vero = Finestra.Contronum(self,a) if vero == "F": avviso = "Il lato a ="+ a+" <-- non e' di tipo numerico; Riprova " msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR) return vero = Finestra.Contronum(self,b) if vero == "F": avviso = "Il lato b ="+ b+" <-- non e' di tipo numerico; Riprova " msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR) return vero =Finestra.Contronum(self,c) if vero == "F": avviso = "Il lato c ="+ c+" <-- non e' di tipo numerico; Riprova " msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR) return # li trasforma in virgola mobile e poi verifica che corrispondano ad un triangolo a= float(a) b=float(b) c=float(c) p = (a+b+c)/2.0 if p <=a or p <= b or p <= c: avviso ='I dati immessi non sono quelli di un triangolo; Riprova' msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR) return else: # calcolo area triangolo area =sqrt(p*(p-a)*(p-b)*(p-c)) avviso =" L'area del triangolo misura Mq "+str(area) msg = wx.MessageBox( avviso, 'Risultato',wx.OK ) return def Contronum(self,valore): # serve per la verifica che i dati immessi siano di tipo numerico vero = "F" for i in range(len(valore)): if valore[i] in digits : vero = "T" continue else: |
class Example(wx.Frame): def __init__(self, parent, title): super(Example,self).__init__(parent, title = title, size = (400,300)) self.InitUI() def calcola(self, evt): a=str(self.latoa.GetValue()) b=str(self.latob.GetValue()) c=str(self.latoc.GetValue()) vero = self.Contronum(a) if vero == "F": avviso = "Il lato a ="+ a+" <-- non e' di tipo numerico; Riprova " msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR) return vero = self.Contronum(b) if vero == "F": avviso = "Il lato b ="+ b+" <-- non e' di tipo numerico; Riprova " msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR) return vero = self.Contronum(c) if vero == "F": avviso = "Il lato c ="+ c+" <-- non e' di tipo numerico; Riprova " msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR) return # li trasforma in virgola mobile e poi verifica che corrispondano ad un triangolo a = float(a) b = float(b) c = float(c) p = (a+b+c)/2.0 if p <=a or p <= b or p <= c: avviso ='I dati immessi non sono quelli di un triangolo; Riprova' msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR) return else: # calcolo area triangolo area =sqrt(p*(p-a)*(p-b)*(p-c)) avviso =" L'area del triangolo misura Mq "+str(area) msg = wx.MessageBox( avviso, 'Risultato',wx.OK ) return def InitUI(self): font = wx.SystemSettings.GetFont(wx.SYS_SYSTEM_FONT) self.panel = wx.Panel(self) self.panel.SetBackgroundColour("red") self.lato1 = wx.StaticText(self.panel, label = 'Lato 1') self.lato1.SetFont(font) self.lato1.SetForegroundColour((0,0,0)) self.lato1.SetPosition((10,10)) self.latoa = wx.TextCtrl(self.panel) self.latoa.SetFont(font) self.latoa.SetPosition((60,6)) self.lato2 = wx.StaticText(self.panel, label = 'Lato 2') self.lato2.SetFont(font) self.lato2.SetForegroundColour((0,0,0)) self.lato2.SetPosition((10,50)) self.latob = wx.TextCtrl(self.panel) self.latob.SetFont(font) self.latob.SetPosition((60,45)) self.lato3 = wx.StaticText(self.panel, label = 'Lato 3') self.lato3.SetFont(font) self.lato3.SetForegroundColour((0,0,0)) self.lato3.SetPosition((10,90)) self.latoc = wx.TextCtrl(self.panel) self.latoc.SetFont(font) self.latoc.SetPosition((60,85)) self.bottone = wx.Button(self.panel, label = 'Calcola') self.bottone.SetPosition((310, 235)) self.Bind(wx.EVT_BUTTON, self.calcola, self.bottone) def Contronum(self,valore): # serve per la verifica che i dati immessi siano di tipo numerico |
| Linea 352: | Linea 321: |
break return vero def Ddel(self): #serve per la chiusura della finestra return class App(wx.App):# finestra da cui derivano tutte le finestre successive def OnInit(self): self.main = Finestra(None,-1,'') self.main.Show() return 1 def main():#lancia il programma in quanto non caricato come modulo application = App(0) application.MainLoop() |
for i in range(len(valore)): if valore[i] in digits : vero = "T" continue else: vero = "F" break return vero def main(): app = wx.App() ex = Example(None, title = "Calcolo area triangolo") ex.Show() app.MainLoop() |
| Linea 376: | Linea 342: |
| main() | main() |
Problemi in questa pagina? Segnalali in questa discussione
Introduzione
All'interno di questa pagina sono presenti degli esempi di come creare delle semplici interfacce grafiche usando programmi come wxPython, Tkinter e PyGTK.
Tkinter è di norma preinstallato in Ubuntu, mentre wxPython può essere installato con:
sudo apt install python3-wxgtk4.0
- tutto ciò che viene scritto preceduto dal carattere # è considerato dall'interprete come un commento.
questi esempii sono scritti per l'interprete Python 3.x per la guida nella precedente versione Python 2.7.xx, vedi InterfacceGrafiche
PyGTK
GTK+ è un toolkit per la creazione di interfacce grafiche è stato progettato inizialmente come ausilio alla programmazione per 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 riutilizzare dello stesso codice in più applicazioni.
1 import gi
2 gi.require_version('Gtk', '3.0')
3 from gi.repository import Gtk
4 from math import sqrt
5
6 class Triangolo:
7 a, b, c = 0, 0, 0
8
9 # Metodo costruttore, in python i costruttori hanno il nome speciale __init__
10 def __init__(self,a,b,c):
11 # Controlliamo se i tre valori dati possono effettivamente
12 #essere le misure dei lati di un triangolo.
13 # Caso contrario solleviamo una bella eccezione!
14 if ((a+b>c) and (a+c>b) and (b+c>a)):
15 self.a=a
16 self.b=b
17 self.c=c
18 else:
19 raise "TriangoloImpossibile"("I lati non possono formare un triangolo")
20 # abbiamo dato un nome ed un essaggio di errore all'eccezione
21 # Metodo che calcola il perimetro
22 def perimetro(self):
23 return self.a + self.b + self.c
24
25 # Metodo che calcola l'area (tramite formula di Erone)
26 def area(self):
27 p=self.perimetro()/2.0
28 return sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))
29
30 class Finestra(Gtk.Window):
31 def __init__(self):
32 Gtk.Window.__init__(self, title = "Calcolo area triangolo")
33
34 self.riga1 = Gtk.HBox()
35 self.riga2 = Gtk.HBox()
36 self.riga3 = Gtk.HBox()
37 self.colonna = Gtk.VBox()
38
39
40 self.label1 = Gtk.Label(label = "Lato 1 ")
41 self.label2 = Gtk.Label(label = "Lato 2 ")
42 self.label3 = Gtk.Label(label = "Lato 3 ")
43 self.entry1 = Gtk.Entry()
44 self.entry2 = Gtk.Entry()
45 self.entry3 = Gtk.Entry()
46 self.button = Gtk.Button(label = "Calcola")
47 self.button.connect("clicked", self.calcola)
48 self.risultato = Gtk.Label(" -- ")
49
50 self.riga1.pack_start(self.label1, True, True, 0)
51 self.riga1.pack_start(self.entry1, True, True, 0)
52 self.riga2.pack_start(self.label2, True, True, 0)
53 self.riga2.pack_start(self.entry2, True, True, 0)
54 self.riga3.pack_start(self.label3, True, True, 0)
55 self.riga3.pack_start(self.entry3, True, True, 0)
56
57 self.colonna.pack_start(self.riga1, True, True, 7)
58 self.colonna.pack_start(self.riga2, True, True, 7)
59 self.colonna.pack_start(self.riga3, True, True, 7)
60 self.colonna.pack_start(self.risultato, True, True, 0)
61 self.colonna.pack_start(self.button, True, True, 3)
62 self.add(self.colonna)
63
64
65
66
67 def calcola(self, widget):
68 try:
69 a = float(self.entry1.get_text()) # legge i dati inseriti nella 1 casella
70 b = float(self.entry2.get_text())
71 c = float(self.entry3.get_text())
72 triangolo = Triangolo(a, b, c)
73 self.risultato.set_text(str(triangolo.area()))
74 except ValueError: # catturo l'eccezione
75 self.risultato.set_text("Devi inserire valori numerici.")
76 except "TriangoloImpossibile": # catturo la seconda eccezione
77 self.risultato.set_text("I lati immessi non possono formare un triangolo")
78
79
80
81 win = Finestra()
82 win.connect("destroy", Gtk.main_quit)
83 win.set_resizable(False)
84 #win.set_default_size(100,120)
85 win.show_all()
86 Gtk.main()
Tkinter
Tk è un piccolo toolkit per la creazione di interfacce grafiche è stato successivamente portato anche verso altri linguaggi come Python, Ruby, Lisp, ecc.. Tkinter è il modulo Python che permette l'interfacciamento con Tk.
Esempio di applicazione
Di seguito viene mostrato un esempio di programma:
1 #!/usr/bin/python3
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
Questa è una versione del programma AreaTriangolo2.py, presente all'interno di questa pagina, che utilizza le librerie wxpython.
Esempio di applicazione
1 #!/usr/bin/python3
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 Example(wx.Frame):
9 def __init__(self, parent, title):
10 super(Example,self).__init__(parent, title = title, size = (400,300))
11 self.InitUI()
12
13 def calcola(self, evt):
14 a=str(self.latoa.GetValue())
15 b=str(self.latob.GetValue())
16 c=str(self.latoc.GetValue())
17
18 vero = self.Contronum(a)
19 if vero == "F":
20 avviso = "Il lato a ="+ a+" <-- non e' di tipo numerico; Riprova "
21 msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR)
22 return
23 vero = self.Contronum(b)
24 if vero == "F":
25 avviso = "Il lato b ="+ b+" <-- non e' di tipo numerico; Riprova "
26 msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR)
27 return
28 vero = self.Contronum(c)
29 if vero == "F":
30 avviso = "Il lato c ="+ c+" <-- non e' di tipo numerico; Riprova "
31 msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR)
32 return
33 # li trasforma in virgola mobile e poi verifica che corrispondano ad un triangolo
34 a = float(a)
35 b = float(b)
36 c = float(c)
37
38 p = (a+b+c)/2.0
39
40 if p <=a or p <= b or p <= c:
41 avviso ='I dati immessi non sono quelli di un triangolo; Riprova'
42 msg = wx.MessageBox( avviso, 'Errore',wx.OK | wx.ICON_ERROR)
43 return
44 else:
45 # calcolo area triangolo
46 area =sqrt(p*(p-a)*(p-b)*(p-c))
47 avviso =" L'area del triangolo misura Mq "+str(area)
48 msg = wx.MessageBox( avviso, 'Risultato',wx.OK )
49
50 return
51 def InitUI(self):
52 font = wx.SystemSettings.GetFont(wx.SYS_SYSTEM_FONT)
53 self.panel = wx.Panel(self)
54 self.panel.SetBackgroundColour("red")
55 self.lato1 = wx.StaticText(self.panel, label = 'Lato 1')
56 self.lato1.SetFont(font)
57 self.lato1.SetForegroundColour((0,0,0))
58 self.lato1.SetPosition((10,10))
59
60 self.latoa = wx.TextCtrl(self.panel)
61 self.latoa.SetFont(font)
62 self.latoa.SetPosition((60,6))
63
64 self.lato2 = wx.StaticText(self.panel, label = 'Lato 2')
65 self.lato2.SetFont(font)
66 self.lato2.SetForegroundColour((0,0,0))
67 self.lato2.SetPosition((10,50))
68
69 self.latob = wx.TextCtrl(self.panel)
70 self.latob.SetFont(font)
71 self.latob.SetPosition((60,45))
72
73 self.lato3 = wx.StaticText(self.panel, label = 'Lato 3')
74 self.lato3.SetFont(font)
75 self.lato3.SetForegroundColour((0,0,0))
76 self.lato3.SetPosition((10,90))
77
78 self.latoc = wx.TextCtrl(self.panel)
79 self.latoc.SetFont(font)
80 self.latoc.SetPosition((60,85))
81
82 self.bottone = wx.Button(self.panel, label = 'Calcola')
83 self.bottone.SetPosition((310, 235))
84 self.Bind(wx.EVT_BUTTON, self.calcola, self.bottone)
85
86
87
88 def Contronum(self,valore): # serve per la verifica che i dati immessi siano di tipo numerico
89
90 vero = "F"
91 for i in range(len(valore)):
92
93 if valore[i] in digits :
94
95 vero = "T"
96
97 continue
98
99 else:
100
101 vero = "F"
102
103 break
104 return vero
105 def main():
106 app = wx.App()
107 ex = Example(None, title = "Calcolo area triangolo")
108 ex.Show()
109 app.MainLoop()
110
111 if __name__ == '__main__':
112 main()
