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/InterfacceGrafichePython3"
Differenze tra le versioni 15 e 16
Versione 15 del 03/03/2020 17.11.43
Dimensione: 14198
Autore: wilecoyote
Commento: Verificata 16.04 18.04
Versione 16 del 03/03/2020 17.12.58
Dimensione: 14205
Autore: wilecoyote
Commento:
Le cancellazioni sono segnalate in questo modo. Le aggiunte sono segnalate in questo modo.
Linea 19: Linea 19:
 * questi listati sono scritti per l'interprete '''Python 2.7.xx''' per la guida nella più recente versione '''Python 3.x''', vedi [[Programmazione/Python/ListatiPython3 | ListatiPython3]]  * questi listati sono scritti per l'interprete '''Python 3.x''' per la guida nella più recente versione '''Python 2.7.xx''', vedi [[Programmazione/Python/InterfacceGrafiche| InterfacceGrafiche]]


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 listati sono scritti per l'interprete Python 3.x per la guida nella più recente 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