diff --git a/funzioni.py b/funzioni.py index 081207e..e8242f5 100644 --- a/funzioni.py +++ b/funzioni.py @@ -4,6 +4,7 @@ import re #import canvas2svg import grafico + class Applicazione(tkinter.Frame): """ Classe dell'applicazione @@ -11,47 +12,47 @@ class Applicazione(tkinter.Frame): """ def __init__(self, finestra): tkinter.Frame.__init__(self, finestra) - + #Impostazioni della finestra - + finestra.title("Impostazioni") - finestra.resizable(0,0) + finestra.resizable(0, 0) finestra.geometry("{}x{}+{}+{}".format( - 645, 110, - int((finestra.winfo_screenwidth() / 2) - 320), + 645, 110, + int((finestra.winfo_screenwidth() / 2) - 320), finestra.winfo_screenheight() )) - + #Variabili - + self.tipo = tkinter.StringVar() self.testo = tkinter.StringVar() self.tipo.set("normale") - self.grafico = grafico.Grafico(20,20) + self.grafico = grafico.Grafico(20, 20) self.frame = self.grafico.frame self.widgets() self.scritta() - + def widgets(self): """ Creare e disegna i widget della finestra. """ - + #Etichette self.label1 = tkinter.Label( - finestra, + finestra, textvariable=self.testo ) self.label2 = tkinter.Label( - finestra, + finestra, text="Intervallo:" ) self.label3 = tkinter.Label( - finestra, + finestra, text="Colore:" ) - + #Caselle di testo self.casella1 = tkinter.Entry(finestra) @@ -61,122 +62,125 @@ class Applicazione(tkinter.Frame): #Opzioni self.scelta1 = tkinter.Radiobutton( - finestra, - value="normale", - text="Normale", + finestra, + value="normale", + text="Normale", variable=self.tipo, command=self.scritta ) self.scelta2 = tkinter.Radiobutton( - finestra, - value="punti", - text="Definita a punti", - variable=self.tipo, + finestra, + value="punti", + text="Definita a punti", + variable=self.tipo, command=self.scritta ) - self.scelta3 = tkinter.Radiobutton(finestra, - value="tratti", - text="Definita a tratti", - variable=self.tipo, + self.scelta3 = tkinter.Radiobutton( + finestra, + value="tratti", + text="Definita a tratti", + variable=self.tipo, command=self.scritta ) #Pulsanti self.pulsante1 = tkinter.Button( - finestra, - text="Disegna", + finestra, + text="Disegna", command=self.disegna ) - self.pulsante2 = tkinter.Button(finestra, - text="Cancella", + self.pulsante2 = tkinter.Button( + finestra, + text="Cancella", command=self.vuota ) self.pulsante3 = tkinter.Button( - finestra, - text="Pulisci Canvas", + finestra, + text="Pulisci Canvas", command=self.grafico.pulisci ) - self.pulsante4 = tkinter.Button(finestra, - text="Salva", + self.pulsante4 = tkinter.Button( + finestra, + text="Salva", command=self.salva ) self.pulsante5 = tkinter.Button( - finestra, - text="Esci", + finestra, + text="Esci", command=finestra.quit ) - + #Layout dei widgets - + self.label1.grid( column=0, row=0, sticky="nw", pady=5, padx=5 ) self.label2.grid( - column=0, row=1, - sticky="nw", + column=0, row=1, + sticky="nw", pady=2.5, padx=5 ) self.label3.grid( - column=0, row=2, - sticky="nw", + column=0, row=2, + sticky="nw", pady=2.5, padx=5 ) self.casella1.grid( - column=1, row=0, - sticky="nw", + column=1, row=0, + sticky="nw", pady=5, padx=5 ) self.casella2.grid( - column=1, row=1, - sticky="nw", + column=1, row=1, + sticky="nw", pady=2.5, padx=5 ) self.casella3.grid( - column=1, row=2, + column=1, row=2, padx=5, pady=2.5 ) self.scelta1.grid( - column= 2, row=1, - sticky="nw", + column=2, row=1, + sticky="nw", pady=2.5, padx=5 ) self.scelta2.grid( - column= 3, row=1, - sticky="nw", + column=3, row=1, + sticky="nw", pady=2.5, padx=5 ) self.scelta3.grid( - column= 4, row=1, - sticky="nw", + column=4, row=1, + sticky="nw", pady=2.5, padx=5 ) self.pulsante1.grid( - column= 2, row=0, - sticky="nwes", + column=2, row=0, + sticky="nwes", pady=2.5, padx=5 ) self.pulsante2.grid( - column= 3, row=0, - sticky="nwes", + column=3, row=0, + sticky="nwes", pady=2.5, padx=5 ) self.pulsante3.grid( - column=4, row=0, - sticky="nwes", + column=4, row=0, + sticky="nwes", pady=2.5, padx=5 ) self.pulsante4.grid( - column=2, row=2, - sticky="nwes", - pady=2.5, padx=5, + column=2, row=2, + sticky="nwes", + pady=2.5, padx=5, columnspan=2 ) self.pulsante5.grid( - column=4, row=2, - sticky="nwes", + column=4, row=2, + sticky="nwes", pady=2.5, padx=5 ) @@ -188,18 +192,18 @@ class Applicazione(tkinter.Frame): self.testo.set("f(x): y =") elif self.tipo.get() == "tratti": self.testo.set("[f1(x),(intervallo)],[f2(x),(intervallo)],...") - else: + else: self.testo.set("(x1,y1),(x2,y2),...") - + def disegna(self): """ Disegna il grafico della funzione o dei dati inseriti """ - + #Converte la funzione in modo che possa essere interpretata da eval(). funzione = re.sub( "([\+-\-]?\d+)(x)", - "\\1*x", + "\\1*x", self.casella1.get().replace("^", "**") ) funzione = re.sub( @@ -208,33 +212,33 @@ class Applicazione(tkinter.Frame): funzione ) funzione = re.sub( - "(.+)(\!)", - "factorial(\\1)", + "(.+)(\!)", + "factorial(\\1)", funzione ) - + #Legge l'intervallo inserito. try: intervallo = eval(self.casella2.get()) except SyntaxError: - inizio = -self.grafico.X + inizio = -self.grafico.X fine = self.grafico.X else: inizio = float(intervallo[0]) fine = float(intervallo[1]) - + #Legge il colore inserito. colore = self.casella3.get() if colore == "": colore = "orange" - + #Disegna il grafico in base al tipo inserito. if self.tipo.get() == "normale": funzione = eval("lambda x:" + funzione) self.grafico.disegna(funzione, inizio, fine, colore) elif self.tipo.get() == "tratti": funzioni = re.sub("(\[\()(.+?\))", "\\1lambda x:\\2", funzione) - funzioni = re.sub("(\[)", "(", funzioni.replace("]",")")) + funzioni = re.sub("(\[)", "(", funzioni.replace("]", ")")) for funzione in eval(funzioni): self.grafico.disegna( funzione[0], @@ -245,12 +249,12 @@ class Applicazione(tkinter.Frame): else: funzione = grafico.punti(eval(self.casella1.get())) self.grafico.disegna( - funzione, + funzione, punti[0][0], - punti[len(punti)-1][1], + punti[len(punti) - 1][1], colore ) - + def vuota(self): """ Rimuove tutti i dati inseriti. @@ -259,20 +263,20 @@ class Applicazione(tkinter.Frame): self.casella2.delete(0, "end") self.casella3.delete(0, "end") self.finestra.withdraw() - + def salva(self): """ Salva il grafico in formato svg. """ - opzioni ={ + opzioni = { "parent": self.frame, "defaultextension": ".svg", - "initialfile": "grafico.svg", + "initialfile": "grafico.svg", "title": "Salva il grafico" } file = tkinter.filedialog.asksaveasfilename(**opzioni) canvas2svg.saveall(file, self.grafico.canvas) - + finestra = tkinter.Tk() app = Applicazione(finestra) -app.mainloop() \ No newline at end of file +app.mainloop() diff --git a/grafico.py b/grafico.py index a20e3d7..df5a3b0 100644 --- a/grafico.py +++ b/grafico.py @@ -1,5 +1,6 @@ import turtle + def punti(tupla): """ Data una tupla del tipo ((x_1, y_1), (x_2, y_2), (x_n, y_n),...) @@ -7,6 +8,7 @@ def punti(tupla): """ return lambda x: dict(tupla)[float(x)] + class Varie(): """ Funzioni varie per turtle. @@ -15,10 +17,11 @@ class Varie(): """ Sposta il cursore al punto (x, y) senza tracciare una linea. """ - self.pu() - self.goto(x,y) + self.pu() + self.goto(x, y) self.pd() + class Freccia(turtle.Pen, Varie): """ Cursore di turtle personalizzato. @@ -29,8 +32,9 @@ class Freccia(turtle.Pen, Varie): self.shape("triangle") self.shapesize(0.5) + class Grafico(turtle.Pen, Varie): - + def __init__(self, X=10, Y=10): """ Inizializzazione del grafico @@ -44,52 +48,55 @@ class Grafico(turtle.Pen, Varie): self.frame = turtle._Screen._root self.assi() self.frecce() - + def assi(self): """ Disegna gli assi del piano cartesiano. """ - turtle.setworldcoordinates(-(self.X+2), -(self.Y+2), self.X+2, self.Y+2) + turtle.setworldcoordinates( + -(self.X + 2), -(self.Y + 2), + self.X + 2, self.Y + 2 + ) self.hideturtle() self.speed(0) self.vai(-self.X, 0) - self.fd(self.X*2) + self.fd(self.X * 2) self.vai(0, -self.Y) self.lt(90) - self.fd(self.Y*2) - + self.fd(self.Y * 2) + def frecce(self): """ Disegna le frecce e i nomi degli assi. """ a = Freccia() a.vai(self.X, 0) - a.write(" x", font=("helvetiva",16)) + a.write(" x", font=("helvetiva", 16)) b = Freccia() b.lt(90) b.vai(0, self.Y) - b.write(" y", font=("helvetiva",16)) + b.write(" y", font=("helvetiva", 16)) def disegna(self, funzione, inizio, fine, colore="blue"): """ Disegna una funzione nel piano cartesiano. """ - medio = 2/self.X + medio = 2 / self.X self.color(colore) try: - self.vai(inizio,funzione(inizio)) + self.vai(inizio, funzione(inizio)) except ZeroDivisionError: - self.vai(inizio,funzione(inizio+1*medio)) - for x in range(int(inizio/medio),int(fine/medio)+1): + self.vai(inizio, funzione(inizio + 1 * medio)) + for x in range(int(inizio / medio), int(fine / medio) + 1): x *= medio try: self.goto(x, funzione(x)) except ZeroDivisionError: - self.vai(x, funzione(x+1*medio)) - + self.vai(x, funzione(x + 1 * medio)) + def pulisci(self): """ Pulisce il canvas e ridisegna gli assi. """ self.reset() - self.assi() \ No newline at end of file + self.assi()