codice:
from Tkinter import *
from math import *
imp = open("fx.py","w")
imp.write("def f(x):\n")
imp.write("\t\treturn 0\n")
imp.close()
import fx as FX
App=Tk()
#creo il menu
def draw():
if funzione.get()!="":
#creo la funzione
imp = open("fx.py","w")
imp.write("def f(x):\n")
imp.write("\tfrom math import *\n")
imp.write("\ttry:\n")
imp.write("\t\ty="+str(funzione.get())+"\n")
imp.write("\t\treturn y\n")
imp.write("\texcept:\n")
imp.write("\t\treturn 0\n")
imp.close()
reload(FX)
#creo il grafico della funzione
canv.create_line(data())
def drawDf():
canv.create_line(dataDf(),stipple="gray25")
menu=Frame(width=80)
def clear():
toerase =canv.find_all()
toerase=toerase[CANV:len(toerase)]
for K in toerase:
canv.delete(K)
#menu.grid_propagate(0)
labelfx=Label(menu,text="funzione:")
funzione=Entry(menu)
draw=Button(menu,text="draw",command=draw)
Df=Button(menu,text="f'",command=drawDf)
clear=Button(menu,text="clear", command=clear)
labelfx.grid(row=0,sticky=NW)
funzione.grid(row=1,sticky=NW)
draw.grid(row=2,sticky=NW)
Df.grid(row=3,sticky=NW)
clear.grid(row=4,sticky=NW)
menu.grid(column=0,sticky=NW)
#coordinate del punto
def oncanvas(move):
XY["text"]="("+str(float(move.x-centro[0])/20)+","+str(-float(move.y-centro[1])/20)+")"
XY=Label(menu, text="(x,y)",width=15)
XY.grid_propagate(0)
XY.grid(row=5,sticky=NW)
centro = [400,300]
#importo i dati della funzione
def Dfx(x):
Dy=(FX.f(x+0.00000001)-FX.f(x))/0.00000001
return Dy
def data():
fx=[]
x0=-50
xn=50
while x0 <= xn:
fx.append([20*x0,-20*FX.f(x0)])
x0=x0+0.1
return fx
def dataDf():
D=[]
x0=-30
xn=30
while x0 <= xn:
D.append([20*x0,-20*Dfx(x0)])
x0=x0+0.1
return D
xmax=1000
ymax=2000
xmin=-1000
ymin=-2000
#creo il canvas e lo scroll
canv=Canvas(height=600,width=800,background="white", scrollregion=(xmin,ymin,xmax,ymax))
#modifico lo scroll per spostare anche le coordinate del centro
def scrY(method,dir,unit):
canv.yview(method,dir,unit)
centro[1]=centro[1]-int(dir)*60
scrollY = Scrollbar (orient=VERTICAL,command=scrY)
scrollY.grid ( row=0, column=2, sticky=N+S )
def scrX(method,dir,unit):
canv.xview(method,dir,unit)
centro[0]=centro[0]-int(dir)*80
scrollX = Scrollbar (orient=HORIZONTAL,command=scrX )
scrollX.grid (row=1, column=1, sticky=E+W )
canv["xscrollcommand"] = scrollX.set
canv["yscrollcommand"] = scrollY.set
#creo gli assi cartesiani
if ymax<600:
ymax=600
canv.create_line(0,ymin,0,ymax)
canv.create_line(xmin,0,xmax,0)
x=0
while x < xmax:
x=x+20
canv.create_line(x,-5,x,5)
x=0
while x > xmin:
x=x-20
canv.create_line(x,-5,x,5)
y=0
while y < ymax:
y=y+20
canv.create_line(-5,y,5,y)
y=0
while y > ymin:
y=y-20
canv.create_line(-5,y,5,y)
#griddo tutto
canv.grid(row=0,column=1)
CANV=len(canv.find_all())
#sposto il grafico della funzione per farlo apparire al centro
canv.yview ( SCROLL,1000, "units" )
canv.xview ( SCROLL,1333, "units" )
canv.bind("<Motion>",oncanvas)
App.mainloop()
p.s. spero non ci siano troppi errori-orrori nella programmazione (come le scrollbar, le ho modificate per far mostrare le coordinate del mouse ma così funzionano solo con i pulsanti, non trascinate la barra)