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 1 e 13 (in 12 versioni)
Versione 1 del 02/03/2020 16.00.33
Dimensione: 16223
Commento:
Versione 13 del 03/03/2020 16.32.03
Dimensione: 13137
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")>>
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'''.

= 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.
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
}}}


= Tkinter =

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.
Linea 21: Linea 25:
Questa è una versione del programma `AreaTriangolo2.py`, presente all'interno di [[Programmazione/Python/Listati#areatraingolo2| questa pagina]]. Di seguito viene mostrato un esempio di programma:
Linea 23: Linea 27:
#!/usr/bin/python #!/usr/bin/python3
Linea 27: Linea 31:

# Importiamo le librerie per l'interfaccia grafica GTK
import pygtk
pygtk.require('2.0')
import gtk
# Importiamo i widgets dal modulo Tkinter
from tkinter import *
Linea 37: Linea 38:
    # Attributi della classe (le misure dei tre lati)       # 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 =

== Esempio di applicazione ==
{{{#!python
#!/usr/bin/python3

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

                vero = "F"
                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()

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

= PyGTK =

{{{#!python
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from math import sqrt

class Triangolo:
Linea 50: Linea 266:
            raise "TriangoloImpossibile" , "I lati non possono formare un triangolo"             raise "TriangoloImpossibile"("I lati non possono formare un triangolo")
Linea 60: Linea 276:

#questa e' la classe che definisce l'interfaccia grafica
class Dialogo:
     class Finestra(Gtk.Window):
Linea 64: Linea 279:
        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 304:
    # 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 316:
            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 325:
    # 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>>

= Tkinter =

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.

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



win = Finestra()
win.connect("destroy", Gtk.main_quit)
win.set_resizable(False)
#win.set_default_size(100,120)
win.show_all()
Gtk.main()
Linea 240: Linea 336:
= 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()
}}}


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

Tkinter

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.

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

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

PyGTK

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

Ulteriori risorse


CategoryProgrammazione