#--------------------------------------------------------------------- # ESEMPIO UTILIZZO LIBRERIA PIL PER TRACCIAMENTO FUNZIONE, # VISUALIZZAZIONE IN TKINTER E SALVATAGGIO SU FILE .PNG # BY CLAUDIO FIN NOVEMBRE 2008 #--------------------------------------------------------------------- import Image, ImageTk, Tkinter, ImageDraw, math, ImageFont #--------------------------------------------------------------------- # CLASSE PER LA DEFINIZIONE DI UN RETTANGOLO ALL'INTERNO DELL'AREA # GRAFICA E LA CONVERSIONE DI VALORI REAL ARBITRARI IN COORDINATE # PIXEL FISICHE #--------------------------------------------------------------------- class relg: # SETTA LE COORDINATE FISICHE DEL RETTANGOLO def setwnd(self,coord): self.minx=coord[0] self.miny=coord[1] self.maxx=coord[2] self.maxy=coord[3] self.delta_x=self.maxx-self.minx self.delta_y=self.maxy-self.miny # SETTA LE COORDINATE LOGICHE DEL RETTANGOLO def setval(self,coord): self.minxr=coord[0] self.minyr=coord[1] self.maxxr=coord[2] self.maxyr=coord[3] self.delta_xr=self.maxxr-self.minxr self.delta_yr=self.maxyr-self.minyr # CONVERTE LA COORDINATA X LOGICA IN FISICA def xmap(self,xr): alfa=(xr-self.minxr)/self.delta_xr return round(alfa*self.delta_x+self.minx) # CONVERTE LA COORDINATA Y LOGICA IN FISICA def ymap(self,yr): alfa=(yr-self.minyr)/self.delta_yr return round(alfa*self.delta_y+self.miny) #--------------------------------------------------------------------- # TRACCIAMENTO FUNZIONE SU IMMAGINE IMG #--------------------------------------------------------------------- def disegna(img): # CREA TRACCIATORE GRAFICO dr=ImageDraw.Draw(img) # SBIANCA L'AREA GRAFICA dr.rectangle((0,0,WSC,HSC),"white") # IMPOSTA LE COORDINATE FISICHE E LOGICHE rel=relg() rel.setwnd((30,20,270,180)) rel.setval((-12.0,1.2,12.0,-0.2)) #TRACCIA ASSI X E Y PASSANTI PER LO ZERO dr.line(( rel.xmap(-12.0),rel.ymap(0.0), \ rel.xmap(12.0),rel.ymap(0.0) ), \ fill="blue") dr.line(( rel.xmap(0.0),rel.ymap(-0.05), \ rel.xmap(0.0),rel.ymap(1.2) ), \ fill="blue") # TRACCIA ASSI SECONDARI dr.line(( rel.xmap(-10.0),rel.ymap(-0.05), \ rel.xmap(-10.0),rel.ymap(1.2) ), \ fill="lime") dr.line(( rel.xmap(10.0),rel.ymap(-0.05), \ rel.xmap(10.0),rel.ymap(1.2) ), \ fill="lime") dr.line(( rel.xmap(-11.5),rel.ymap(1.0), \ rel.xmap(11.5),rel.ymap(1.0) ), \ fill="lime") fnt=ImageFont.truetype("arial.ttf",16) # SCRIVE I NOMI DEGLI ASSI E I VALORI dr.text((rel.xmap(11.0),rel.ymap(0.15)), "X",font=fnt,fill="black") dr.text((rel.xmap(-1.3),rel.ymap(1.2)), "Y",font=fnt,fill="black") dr.text((rel.xmap(-11.0),rel.ymap(-0.08)), "-10",fill="black") dr.text((rel.xmap(9.5),rel.ymap(-0.08)), "10",fill="black") dr.text((rel.xmap(-0.2),rel.ymap(-0.08)), "0",fill="black") dr.text((rel.xmap(-11.0),rel.ymap(0.1)), "0",fill="black") dr.text((rel.xmap(-11.0),rel.ymap(1.1)), "1",fill="black") # DISEGNA LA FUNZIONE, CALCOLA LA LISTA DI COORDINATE E LA # PASSA AL METODO LINE CHE DISEGNA TUTTI I SEGMENTI coordinate=[] minx,maxx=-10.0,10.0 punti=40 segm=(maxx-minx)/(punti-1) for p in xrange(punti): x=segm*p+minx y=1/(1+math.e**-x) coordinate.extend([rel.xmap(x),rel.ymap(y)]) dr.line(coordinate,fill="red") # DISTRUGGE TRACCIATORE GRAFICO del dr #--------------------------------------------------------------------- # CREA FINESTRA GRAFICA VISIBILE E VISUALIZZA L'IMMMAGINE PRODOTTA #--------------------------------------------------------------------- class Applicazione: def __init__ (self): self.form1=Tkinter.Tk() self.canvas1=Tkinter.Canvas(self.form1, \ width=int(WSC),height=int(HSC)) self.canvas1.grid(column=0,row=0) self.im=ImageTk.PhotoImage(img) self.canvas1.create_image(2,2,image=self.im,anchor="nw") # DEFINISCE GRANDEZZA AREA GRAFICA WSC,HSC=300,200 # CREA IMMAGINE VUOTA img=Image.new("RGB",(WSC,HSC)) # DISEGNA LA FUNZIONE disegna(img) # LA VISUALIZZA IN TKINTER app=Applicazione() app.form1.mainloop() # LA SALVA SU DISCO img.save("sigmoide.png")