vi posto il codice del programma che ho creato.
@Ikitt, con il mio modo posso importare qualsiasi funzione supportata da python, con il tuo devo accontentarmi delle polinomiali
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)