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 4 e 5
Versione 4 del 27/09/2006 07.17.41
Dimensione: 6849
Commento:
Versione 5 del 28/09/2006 14.27.37
Dimensione: 11180
Autore: gennaro
Commento:
Le cancellazioni sono segnalate in questo modo. Le aggiunte sono segnalate in questo modo.
Linea 135: Linea 135:
== Tkinter ==
Tk è un piccolo toolkit per la creazione di gui scritto originariamente da John Ousterhout come estensione per il linguaggio Tcl. E' stato successivamente portato anche verso altri linguaggi (Python,Ruby,Lisp...). Tkinter è il modulo python che permette l'interfacciamento con Tk.[[BR]]
[[BR]]
Il sito degli sviluppatori tcl/tk è http://www.tcl.tk/

=== Esempio di applicazione ===
Presentiamo il solito programma dimostrativo che calcola l'area di un triangolo.
{{{#!python
#!/usr/bin/python

# Importiamo la funzione sqrt (radice quadrata) dal modulo math
from math import sqrt
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()
}}}

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':

http://www.pygtk.org/

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

Tkinter

Tk è un piccolo toolkit per la creazione di gui scritto originariamente da John Ousterhout come estensione per il linguaggio Tcl. E' stato successivamente portato anche verso altri linguaggi (Python,Ruby,Lisp...). Tkinter è il modulo python che permette l'interfacciamento con Tk.BR BR Il sito degli sviluppatori tcl/tk è http://www.tcl.tk/

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 from Tkinter import *
   6 
   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()


CategoryNuoviDocumenti