Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Pagina non alterabile
  • Informazioni
  • Allegati
  • Differenze per "Programmazione/Python/InterfacceGrafiche"
Differenze tra le versioni 1 e 27 (in 26 versioni)
Versione 1 del 26/09/2006 22.16.23
Dimensione: 6702
Commento: Prima stesura
Versione 27 del 28/01/2024 18.22.04
Dimensione: 16627
Autore: jeremie2
Commento:
Le cancellazioni sono segnalate in questo modo. Le aggiunte sono segnalate in questo modo.
Linea 1: Linea 1:
Describe LinguaggioPython/GUI here.
Python GUI

Ci sono un gran numero di toolkit disponibili per creare interfacce grafiche (GUI) con Python, da Tkinter (gia' compresa nella installazione di Python che consente l'interfaccia con X-Windows) a numerose altre multipiattaforma o specifiche per un certo ambiente.

Tra le principali citiamo: '''wxPython''', '''PyGtk''' e '''PyQt''', ma altre possiamo trovarle qui:

http://wiki.python.org/moin/GuiProgramming

=PyGTK=

GTK+ (acronimo che sta per GIMP ToolKit) è 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''' e' un set di moduli che permettono l'interfaccia tra Python e le librerie GTK, e' un toolkit orientato agli oggetti, permette quindi la possibilita' di riusare lo stesso codice in piu' applicazioni, e' stato portato ai Python coders da James Henstridge in collaborazione con un team di developers volontari.

Il sito ufficiale (in inglese di PyGTK) e':
http://www.pygtk.org/
La documentazione in italiano si trova qui:
http://www.parafernalia.org/pygtk/


Questa è una versione del programma Triangolo2.py del wiki LinguaggioPython:
## page was renamed from Programmazione/Python/GUI
## page was renamed from LinguaggioPython/GUI
#format wiki
#language it
<<BR>>
<<Indice(depth=1)>>
<<Informazioni(forum="https://forum.ubuntu-it.org/viewtopic.php?f=46&t=631491"; rilasci="18.04 16.04 14.04")>>

= Introduzione =

All'interno di questa pagina sono presenti degli esempi di come creare delle semplici interfacce grafiche usando programmi come '''wxPython''', '''PyGTK''' e '''!PyQt'''.

 * tutto ciò che viene scritto preceduto dal carattere # è considerato dall'interprete come un commento.
 * questi esempii sono scritti per l'interprete '''Python 2.7.xx''', per la guida nella più recente versione '''Python 3.x''', vedi [[Programmazione/Python/InterfacceGrafichePython3 | InterfacceGrafichePython3]]

= PyGTK =

'''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]].
Linea 29: Linea 30:
Linea 69: Linea 71:
                                                       # e lo indiriziamo a una funzione                                                        # e lo indirizziamo a una funzione
Linea 73: Linea 75:
        self.bottone = gtk.Button("Calcolo") # definisco il bottone calcolo
        self.bottone.connect("clicked", self.calcola) # catturo il click e lo indirizzo
        self.bottone = gtk.Button("Calcolo") # definiamo il bottone calcolo
        self.bottone.connect("clicked", self.calcola) # catturiamo il click e lo indirizzo
Linea 79: Linea 81:
        self.riga1 = gtk.HBox() # creo un contenitore dove         self.riga1 = gtk.HBox() # creiamo un contenitore dove
Linea 81: Linea 83:
        self.riga1.pack_start(self.etichetta1) # inserisco l'ediachetta e la casella di input nella 1 riga         self.riga1.pack_start(self.etichetta1) # inseriamo l'etichetta e la casella di input nella 1 riga
Linea 93: Linea 95:
        self.risultato = gtk.Label(" -- ") # creo un'etichetta per il risultato
        self.colonna = gtk.VBox() # creo un contenitore dove
        self.risultato = gtk.Label(" -- ") # creiamo un'etichetta per il risultato
        self.colonna = gtk.VBox() # creiamo un contenitore dove
Linea 96: Linea 98:
        self.colonna.pack_start(self.riga1) # e inserisco le righe, il pulsante e l'etichetta del risultato         self.colonna.pack_start(self.riga1) # e vi inseriamo le righe, il pulsante e l'etichetta del risultato
Linea 101: Linea 103:
        self.window.add(self.colonna) # inserisco il tutto nella finestra
        self.window.show_all() # comando ce visualizza la finestra ed il suo contenuto
        self.window.add(self.colonna) # inseriamo il tutto nella finestra
        self.window.show_all() # comando che visualizza la finestra ed il suo contenuto
Linea 130: Linea 132:
}}} ''Listato del programma Area``Triangolo2.py con interfaccia grafica GTK+''
[[BR]][[BR]]
}}} ''Listato del programma !AreaTriangolo2.py con interfaccia grafica GTK+''
<<BR>>

= 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:
{{{#!python
#!/usr/bin/python

# Importiamo la funzione sqrt (radice quadrata) dal modulo math
from math import sqrt
# Importiamo i widgets dal modulo Tkinter
from Tkinter import *

# Definiamo una classe Triangolo con tre metodi:
# un costruttore, un metodo che calcola il perimetro e uno che calcola l'area del triangolo.
class Triangolo:

      # Attributi della classe (le misure dei tre lati)
      a, b, c = 0, 0, 0

      # Metodo costruttore
      def __init__(self,a,b,c):
         # Controlliamo se i tre valori dati possono effettivamente essere le misure dei lati di un triangolo.
         # Caso contrario solleviamo una bella eccezione!
         if ((a+b>c) and (a+c>b) and (b+c>a)):
            self.a=a
            self.b=b
            self.c=c
         else:
            # abbiamo dato un nome ed un essaggio di errore all'eccezione
            raise "TriangoloImpossibile" , "I lati non possono formare un triangolo"

      # Metodo che calcola il perimetro
      def perimetro(self):
         return self.a + self.b + self.c

      # Metodo che calcola l'area (tramite formula di Erone)
      def area(self):
         p=self.perimetro()/2.0
         return sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))


# questa e' la classe che definisce l'interfaccia grafica
class Dialogo(Frame):

     def __init__(self):
        Frame.__init__(self)
        self.master.title("Area triangolo.") # Diamo il titolo alla finestra.
        self.master.minsize(250,150) # Dimensioni minime della finestra
        self.grid(sticky=E+W+N+S)

        self.ris=StringVar() # Questa variabile stringa viene usata per
        self.ris.set("---") # aggiornare la gui quando il risultato cambia.

        # Rendiamo ridimensionabile la finestra dell'applicazione
        top=self.winfo_toplevel()
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)

        for i in range(5): self.rowconfigure(i, weight=1)
        self.columnconfigure(1, weight=1)


        self.etichetta1=Label(self, text="Lato 1 ") # Etichetta del lato 1
        self.etichetta1.grid(row=0, column=0, padx=2)
 
        self.entrata1=Entry(self) # Casella d'inserimento del lato 1
        self.entrata1.grid(row=0, column=1, pady=2, padx=2, sticky=E+W+N+S)

        self.etichetta2=Label(self, text="Lato 2 ") # Etichetta del lato 2
        self.etichetta2.grid(row=1, column=0, padx=2)

        self.entrata2=Entry(self) # Casella d'inserimento del lato 2
        self.entrata2.grid(row=1, column=1, pady=2, padx=2, sticky=E+W+N+S)

        self.etichetta3=Label(self, text="Lato 3 ") # Etichetta del lato 3
        self.etichetta3.grid(row=2, column=0, padx=2)

        self.entrata3=Entry(self) # Casella d'inserimento del lato 3
        self.entrata3.grid(row=2, column=1, pady=2, padx=2, sticky=E+W+N+S)

        self.bottone=Button(self, text="Calcola", command=self.calcola) # Bottone "Calcola"
        self.bottone.grid(row=3, column=0, columnspan=2, pady=2, padx=2, sticky=E+W+N+S)

        self.risultato=Label(self, textvariable=self.ris) # Testo che motra il risultato.
        self.risultato.grid(row=4, column=0, columnspan=2, pady=2, padx=2, sticky=E+W+N+S)


     # Raccogliamo l'input e calcoliamo l'area
     def calcola(self):
        try :
          a=float(self.entrata1.get())
          b=float(self.entrata2.get())
          c=float(self.entrata3.get())
          t=Triangolo(a,b,c)
          self.ris.set("Area = "+str(t.area()))
        except ValueError: self.ris.set("Devi inserire valori numerici.")
        except "TriangoloImpossibile": self.ris.set("I lati immessi non possono formare un triangolo")

          
# Avvio del programma a condizione che non sia caricato come modulo
if __name__=="__main__":
   d=Dialogo()
   d.mainloop()
}}}

= wxPython =

Questa è una versione del programma `AreaTriangolo2.py`, presente all'interno di [[Programmazione/Python/Listati#areatraingolo2| questa pagina]], che utilizza le librerie '''wxpython'''.

== Esempio di applicazione ==

{{{#!python
#!/usr/bin/python

import wx #importiamo l'interfaccia grafica

from string import digits # importiamo una variabile per il controllo dei dati in input
from math import sqrt # importiamo la funzione sqrt per il calcolo della radicequadrata dal modulo math

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:

                vero = "F"

                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()

if __name__ == '__main__':
       main()
}}}

= Ulteriori risorse =

 * [[http://wiki.python.org/moin/GuiProgramming|Programmare interfacce grafiche con Python]]
 * [[http://www.wxpython.org|Sito ufficiale di wxpython]]
 * [[http://www.pygtk.org/|Sito ufficiale di PyGTK]]
 * [[http://www.tcl.tk/|Sito degli sviluppatori tcl/tk]]
 * [[http://www.python.it/|Sito di riferimento per i programmatori python italiani]]
 * [[http://www.python.org/|Il sito ufficiale del linguaggio python]]
Linea 133: Linea 393:
CategoryNuoviDocumenti CategoryProgrammazione


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, PyGTK e PyQt.

  • tutto ciò che viene scritto preceduto dal carattere # è considerato dall'interprete come un commento.
  • questi esempii sono scritti per l'interprete Python 2.7.xx, per la guida nella più recente versione Python 3.x, vedi InterfacceGrafichePython3

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.

Esempio di applicazione

Questa è una versione del programma AreaTriangolo2.py, presente all'interno di questa pagina.

   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+

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/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

Questa è una versione del programma AreaTriangolo2.py, presente all'interno di questa 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()

Ulteriori risorse


CategoryProgrammazione