Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [python] fare interpretare una stringa come una funzione

    ciao, come posso fare per fare interpretare una stringa come una funzione?
    io ho provato (funziona) creando un nuovo file .py dove definisco la funzione per poi importarla ma mi sembra molto laborioso, c'è qualche soluzione migliore?

  2. #2
    vi posto il codice che ho scritto per risolvere il problema:
    codice:
    FX = open("fx.py","w")
    FX.write("def f(x):\n")
    FX.write("\t\treturn 0\n")
    FX.close()
    import fx
    funzione=raw_input("f(x):")
    FX = open("fx.py","w")
    FX.write("def f(x):\n")
    FX.write("\tfrom math import *\n")
    FX.write("\ttry:\n")
    FX.write("\t\ty="+funzione+"\n")
    FX.write("\t\treturn y\n")
    FX.write("\texcept:\n")
    FX.write("\t\treturn 0\n")
    FX.close()
    reload(fx)
    in questo modo posso chiamare la funzione con fx.f(x) e tutto funziona
    esiste qualche procedimento è meno laborioso?

  3. #3
    sinceramente non ho capito il problema...
    cosa vuoi fare esattamente?
    PyGTK GUI programming
    un impegno concreto: eliminare la k dalle tastiere italiane

  4. #4
    ho creato una gui che traccia il grafico di una funzione inserita tramite una casella Entry (in TK) e non riuscivo a fare interpretare il testo immesso come una funzione

  5. #5
    non capisco perche' vuoi scrivere nella entry tutta la funzione, premetto che non conoscendo il programma che stai scrivendo magari non e' fattibile, ma non sarebbe meglio impostare la funzione che prenda i valori inseriti nella entry?
    PyGTK GUI programming
    un impegno concreto: eliminare la k dalle tastiere italiane

  6. #6

    Re: [python] fare interpretare una stringa come una funzione

    Originariamente inviato da suomi_viking_86
    ciao, come posso fare per fare interpretare una stringa come una funzione?
    io ho provato (funziona) creando un nuovo file .py dove definisco la funzione per poi importarla ma mi sembra molto laborioso, c'è qualche soluzione migliore?
    Se il seguente e` migliore, non lo e` di molto

    codice:
    >>> x = [2, 0, 1]
    >>> x
    [2, 0, 1]
    >>> f = "2*x[1]-x[0]+x[1]"
    >>> eval(f)
    -2
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  7. #7
    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)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.