Wiki Ubuntu-it

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

Versione 8 del 02/03/2020 19.52.44

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

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

= PyGTK =

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

Ulteriori risorse


CategoryProgrammazione