Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Pagina non alterabile
  • Informazioni
  • Allegati

Versione 21 del 03/03/2020 17.18.35

Nascondi questo messaggio


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

Ulteriori risorse


CategoryProgrammazione