Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

GRAPHEUR DE FONCTIONS MATHÉMATIQUES


Information sur la source

Catégorie :Math & Algorithmes Classé sous : fonction, graphique, grapheur, math, tkinter Niveau : Débutant Date de création : 23/06/2008 Date de mise à jour : 30/06/2008 22:09:45 Vu / téléchargé: 1 985 / 95

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Permet de tracer un nombre illimité de fonctions mathématiques différentes ainsi que leurs dérivées sur un même graphique.
La fenêtre graphique est entièrement paramétrable (dimensions, échelle...), ainsi que les couleurs des courbes.
 

Source

  • # -*- coding: cp1252 -*-
  • # Grapheur mathématique
  • # Ecrit et immaginé par Amaury
  • from math import *
  • from Tkinter import *
  • import tkMessageBox
  • ux=0
  • global select,h,m
  • save=[]
  • h=30
  • m=50
  • select="black"
  • def onInit():
  • global xmin,xmax,ymin,ymax,pasx,pasy,save
  • h=30
  • m=50
  • lst1.create_rectangle(0,20,200,700,fill="ivory",outline="ivory")
  • can.create_rectangle(0,0,700,700,fill="white",outline="white")
  • try:
  • xmin=float(eval(ent1.get()))
  • except SyntaxError:
  • xmin=-10
  • try:
  • xmax=float(eval(ent2.get()))
  • except SyntaxError:
  • xmax=10
  • try:
  • pasx=float(eval(ent3.get()))
  • except SyntaxError:
  • pasx=1
  • try:
  • ymin=float(eval(ent4.get()))
  • except SyntaxError:
  • ymin=-10
  • try:
  • ymax=float(eval(ent5.get()))
  • except SyntaxError:
  • ymax=10
  • try:
  • pasy=float(eval(ent6.get()))
  • except SyntaxError:
  • pasy=1
  • dx=float(xmax-xmin)
  • dy=float(ymax-ymin)
  • ux=700/dx
  • uy=700/dy
  • uxx=(dx/700)
  • #Coordonnées du O(0,0):
  • xo=ux*(-xmin)
  • yo=uy*ymax
  • # Axes:
  • can.create_line(0,yo,700,yo,fill="red")
  • can.create_line(xo,0,xo,700,fill="red")
  • i=xo
  • j=yo
  • while i>-1:
  • can.create_line(i,yo-2,i,yo+2,fill="red")
  • i=i-(ux*pasx)
  • while j>-1:
  • can.create_line(xo-2,j,xo+2,j,fill="red")
  • j=j-(uy*pasy)
  • i=xo
  • j=yo
  • while i<701:
  • can.create_line(i,yo-2,i,yo+2,fill="red")
  • i=i+(ux*pasx)
  • while j<701:
  • can.create_line(xo-2,j,xo+2,j,fill="red")
  • j=j+(uy*pasy)
  • try:
  • onCalc(str(ent10.get()),select,xo,yo,uy,uxx,xmin)
  • save=[[str(ent10.get()),select]]
  • lst1.create_text(m,h,text="f(x)="+str(ent10.get()),fill=select)
  • h=h+15
  • except SyntaxError:
  • pass
  • def onAdd():
  • global select,h,m,xmin,xmax,ymin,ymax,pasx,pasy
  • dx=float(xmax-xmin)
  • dy=float(ymax-ymin)
  • ux=700/dx
  • uy=700/dy
  • uxx=(dx/700)
  • #Coordonnées du O(0,0):
  • xo=ux*(-xmin)
  • yo=uy*ymax
  • # Axes:
  • can.create_line(0,yo,700,yo,fill="red")
  • can.create_line(xo,0,xo,700,fill="red")
  • i=xo
  • j=yo
  • while i>-1:
  • can.create_line(i,yo-2,i,yo+2,fill="red")
  • i=i-(ux*pasx)
  • while j>-1:
  • can.create_line(xo-2,j,xo+2,j,fill="red")
  • j=j-(uy*pasy)
  • i=xo
  • j=yo
  • while i<701:
  • can.create_line(i,yo-2,i,yo+2,fill="red")
  • i=i+(ux*pasx)
  • while j<701:
  • can.create_line(xo-2,j,xo+2,j,fill="red")
  • j=j+(uy*pasy)
  • try:
  • onCalc(str(ent10.get()),select,xo,yo,uy,uxx,xmin)
  • save.append([str(ent10.get()),select])
  • if h<690:
  • lst1.create_text(m,h,text="f(x)="+str(ent10.get()),fill=select)
  • else:
  • h=30
  • m=150
  • lst1.create_text(m,h,text="f(x)="+str(ent10.get()),fill=select)
  • h=h+15
  • except SyntaxError:
  • pass
  • except NameError:
  • onCalc(str(ent10.get()),"black",xo,yo,uy,uxx,xmin)
  • if h<690:
  • lst1.create_text(m,h,text="dy/dx("+str(ent10.get())+")",fill="black")
  • else:
  • h=30
  • m=125
  • lst1.create_text(m,h,text="dy/dx("+str(ent10.get())+")",fill="black")
  • h=h+15
  • def onCalc(fonction,couleur,xo,yo,uy,uxx,xmin):
  • valeurs=[]
  • a=0
  • while a<701:
  • x=float(xmin+(a*uxx))
  • try:
  • y=-eval (fonction)
  • valeurs.append([x,y])
  • a=a+1
  • except ValueError:
  • y=0
  • valeurs.append([x,y])
  • a=a+1
  • except OverflowError:
  • y=0
  • valeurs.append([x,y])
  • a=a+1
  • except ZeroDivisionError:
  • y=0
  • valeurs.append([x,y])
  • a=a+1
  • except NameError:
  • tkMessageBox.showerror(title="Erreur",message="""Fonction " """ + str(fonction) + """" inconnue""")
  • break
  • a=0
  • while a<700:
  • local0=valeurs[a]
  • local1=valeurs[a+1]
  • x1=a
  • x2=a+1
  • y1=int((local0[1]*uy)+yo)
  • y2=int((local1[1]*uy)+yo)
  • can.create_line(x1,y1,x2,y2,fill=couleur)
  • a=a+1
  • def onSelect(e):
  • global select
  • select=listb.get(listb.curselection())
  • lab.configure(text=select)
  • listb.configure(bg=select)
  • def onDerive():
  • global select,h,m,xmin,xmax,ymin,ymax,pasx,pasy
  • try:
  • xmin=float(eval(ent1.get()))
  • except SyntaxError:
  • xmin=-10
  • try:
  • xmax=float(eval(ent2.get()))
  • except SyntaxError:
  • xmax=10
  • try:
  • pasx=float(eval(ent3.get()))
  • except SyntaxError:
  • pasx=1
  • try:
  • ymin=float(eval(ent4.get()))
  • except SyntaxError:
  • ymin=-10
  • try:
  • ymax=float(eval(ent5.get()))
  • except SyntaxError:
  • ymax=10
  • try:
  • pasy=float(eval(ent6.get()))
  • except SyntaxError:
  • pasy=1
  • onDeriv(str(ent10.get()),select)
  • save.append(["derive",str(ent10.get()),select])
  • if h<690:
  • lst1.create_text(m,h,text="dy/dx("+str(ent10.get())+")",fill=select)
  • else:
  • h=30
  • m=150
  • lst1.create_text(m,h,text="dy/dx("+str(ent10.get())+")",fill=select)
  • h=h+15
  • def onDeriv(fonction,couleur):
  • global select,h,m
  • valeurs=[]
  • a=0
  • dx=float(xmax-xmin)
  • dy=float(ymax-ymin)
  • ux=700/dx
  • uy=700/dy
  • uxx=(dx/700)
  • #Coordonnées du O(0,0):
  • xo=ux*(-xmin)
  • yo=uy*ymax
  • i=xo
  • j=yo
  • while a<701:
  • x=float(xmin+(a*uxx))
  • try:
  • y=-eval (fonction)
  • valeurs.append([x,y])
  • a=a+1
  • except ValueError:
  • y=0
  • valeurs.append([x,y])
  • a=a+1
  • except OverflowError:
  • y=0
  • valeurs.append([x,y])
  • a=a+1
  • except ZeroDivisionError:
  • y=0
  • valeurs.append([x,y])
  • a=a+1
  • except NameError:
  • tkMessageBox.showerror(title="Erreur",message="""Fonction " """ + str(fonction) + """" inconnue""")
  • break
  • a=a+1
  • a=0
  • while a<350:
  • try:
  • y4=y3
  • except NameError:
  • y4=0
  • local0=valeurs[a]
  • local1=valeurs[a+1]
  • dy=local1[1]-local0[1]
  • dx=local1[0]-local0[0]
  • y3=dy/dx
  • y1=int((y4*uy)+yo)
  • y2=int((y3*uy)+yo)
  • can.create_line(2*a,y1,2*(a+1),y2,fill=couleur)
  • a=a+1
  • def onHelp():
  • tkMessageBox.showinfo(title="Syntaxe",message="""Syntaxe des fonctions usuelles pour Python:
  • notation usuelle <=> notation Python
  • log(x)<=> log(x,base)
  • ln(x) <=> log(x,exp(1))
  • Racine(x) <=> sqrt(x)
  • x^n <=> x**n
  • E(x) <=> int(x)
  • sin(x), cos(x) et tan(x) n'ont pas de syntaxe particulière""")
  • def onRefresh():
  • global save,xmin,xmax,pasx,ymin,ymax,pasy
  • can.create_rectangle(0,0,700,700,fill="white",outline="white")
  • try:
  • xmin=float(eval(ent1.get()))
  • except SyntaxError:
  • xmin=-10
  • try:
  • xmax=float(eval(ent2.get()))
  • except SyntaxError:
  • xmax=10
  • try:
  • pasx=float(eval(ent3.get()))
  • except SyntaxError:
  • pasx=1
  • try:
  • ymin=float(eval(ent4.get()))
  • except SyntaxError:
  • ymin=-10
  • try:
  • ymax=float(eval(ent5.get()))
  • except SyntaxError:
  • ymax=10
  • try:
  • pasy=float(eval(ent6.get()))
  • except SyntaxError:
  • pasy=1
  • dx=float(xmax-xmin)
  • dy=float(ymax-ymin)
  • ux=700/dx
  • uy=700/dy
  • uxx=(dx/700)
  • #Coordonnées du O(0,0):
  • xo=ux*(-xmin)
  • yo=uy*ymax
  • # Axes:
  • can.create_line(0,yo,700,yo,fill="red")
  • can.create_line(xo,0,xo,700,fill="red")
  • i=xo
  • j=yo
  • while i>-1:
  • can.create_line(i,yo-2,i,yo+2,fill="red")
  • i=i-(ux*pasx)
  • while j>-1:
  • can.create_line(xo-2,j,xo+2,j,fill="red")
  • j=j-(uy*pasy)
  • i=xo
  • j=yo
  • while i<701:
  • can.create_line(i,yo-2,i,yo+2,fill="red")
  • i=i+(ux*pasx)
  • while j<701:
  • can.create_line(xo-2,j,xo+2,j,fill="red")
  • j=j+(uy*pasy)
  • a=0
  • g=len(save)
  • while a<g:
  • local=save[a]
  • if len(local)==3:
  • onDeriv(local[1],local[2])
  • elif len(local)==2:
  • onCalc(local[0],local[1],xo,yo,uy,uxx,xmin)
  • a=a+1
  • def onZoom(facteur):
  • global save,xmin,xmax,pasx,ymin,ymax,pasy
  • try:
  • xmin=float(eval(ent1.get()))
  • except SyntaxError:
  • xmin=-10
  • try:
  • xmax=float(eval(ent2.get()))
  • except SyntaxError:
  • xmax=10
  • try:
  • pasx=float(eval(ent3.get()))
  • except SyntaxError:
  • pasx=1
  • try:
  • ymin=float(eval(ent4.get()))
  • except SyntaxError:
  • ymin=-10
  • try:
  • ymax=float(eval(ent5.get()))
  • except SyntaxError:
  • ymax=10
  • try:
  • pasy=float(eval(ent6.get()))
  • except SyntaxError:
  • pasy=1
  • xmin,xmax,ymin,ymax=xmin/facteur,xmax/facteur,ymin/facteur,ymax/facteur
  • can.create_rectangle(0,0,700,700,fill="white",outline="white")
  • dx=float(xmax-xmin)
  • dy=float(ymax-ymin)
  • ux=700/dx
  • uy=700/dy
  • uxx=(dx/700)
  • #Coordonnées du O(0,0):
  • xo=ux*(-xmin)
  • yo=uy*ymax
  • # Axes:
  • can.create_line(0,yo,700,yo,fill="red")
  • can.create_line(xo,0,xo,700,fill="red")
  • i=xo
  • j=yo
  • while i>-1:
  • can.create_line(i,yo-2,i,yo+2,fill="red")
  • i=i-(ux*pasx)
  • while j>-1:
  • can.create_line(xo-2,j,xo+2,j,fill="red")
  • j=j-(uy*pasy)
  • i=xo
  • j=yo
  • while i<701:
  • can.create_line(i,yo-2,i,yo+2,fill="red")
  • i=i+(ux*pasx)
  • while j<701:
  • can.create_line(xo-2,j,xo+2,j,fill="red")
  • j=j+(uy*pasy)
  • a=0
  • g=len(save)
  • while a<g:
  • local=save[a]
  • if len(local)==3:
  • onDeriv(local[1],local[2])
  • elif len(local)==2:
  • onCalc(local[0],local[1],xo,yo,uy,uxx,xmin)
  • a=a+1
  • def onFact():
  • try:
  • facteur=float(ent11.get())
  • except ValueError:
  • facteur=1.
  • onZoom(facteur)
  • root=Tk()
  • can=Canvas(width=700,height=700)
  • can.create_rectangle(0,0,700,700,fill="white",outline="black")
  • can.grid (row=0,column=0,rowspan=30)
  • lbl1=Label(root,text="Configuration de la fenètre de traçage:")
  • lbl2=Label(root,text="Xmin =")
  • lbl3=Label(root,text="Xmax =")
  • lbl4=Label(root,text="Ymin =")
  • lbl5=Label(root,text="Ymax =")
  • lbl6=Label(root,text="Pas =")
  • lbl7=Label(root,text="Pas =")
  • listb=Listbox(root)
  • lab=Label(root,text="_")
  • listb.grid(row=10,column=2,rowspan=5)
  • lab.grid(row=10,column=1)
  • # Insertion des éléments dans la liste:
  • for coul in ["gray", "blue", "orange", "yellow", "green", "cyan", "red", "pink", "skyblue", "gold","green"]:
  • listb.insert(END,coul)
  • # Un double click dans la liste appellera la fonction onSelect:
  • listb.bind('<Double-1>',onSelect)
  • ent1=Entry(root)
  • ent2=Entry(root)
  • ent3=Entry(root)
  • ent4=Entry(root)
  • ent5=Entry(root)
  • ent6=Entry(root)
  • bou1=Button(root,text="Nouvelle trace",command=onInit)
  • bou2=Button(root,text="Quitter",command=root.quit)
  • bou3=Button(root,text="Ajouter trace",command=onAdd)
  • bou4=Button(root,text="Tracer dérivée",command=onDerive)
  • bou5=Button(root,text="Syntaxe",command=onHelp)
  • bou6=Button(root,text="Rafraichir",command=onRefresh)
  • bou1.grid(row=28,column=1)
  • bou2.grid(row=29,column=2)
  • bou3.grid(row=27,column=1)
  • bou4.grid(row=27,column=2)
  • bou5.grid(row=29,column=1)
  • bou6.grid(row=28,column=2)
  • lbl1.grid(row=0,column=1,columnspan=2)
  • lbl2.grid(row=1,column=1)
  • lbl3.grid(row=2,column=1)
  • lbl4.grid(row=4,column=1)
  • lbl5.grid(row=5,column=1)
  • lbl6.grid(row=3,column=1)
  • lbl7.grid(row=6,column=1)
  • ent1.grid(row=1,column=2)
  • ent2.grid(row=2,column=2)
  • ent3.grid(row=3,column=2)
  • ent4.grid(row=4,column=2)
  • ent5.grid(row=5,column=2)
  • ent6.grid(row=6,column=2)
  • lbl10=Label(root,text="Configuration du Grapheur:")
  • lbl11=Label(root,text="f(x)=")
  • ent10=Entry(root)
  • lbl10.grid(row=8,column=1,columnspan=2)
  • lbl11.grid(row=9,column=1)
  • ent10.grid(row=9,column=2)
  • ent11=Entry(root)
  • bou10=Button(root,text="Zoom x2",command=lambda arg=2.:onZoom(arg))
  • bou11=Button(root,text="Zoom x4",command=lambda arg=4.:onZoom(arg))
  • bou12=Button(root,text="Zoom x0.5",command=lambda arg=0.5:onZoom(arg))
  • bou13=Button(root,text="Zoom x0.25",command=lambda arg=0.25:onZoom(arg))
  • bou14=Button(root,text="Zoom par facteur",command=onFact)
  • bou10.grid(row=20,column=1)
  • bou11.grid(row=20,column=2)
  • bou12.grid(row=21,column=1)
  • bou13.grid(row=21,column=2)
  • bou14.grid(row=22,column=1)
  • ent11.grid(row=22,column=2)
  • lst1=Canvas(root,width=200,height=700)
  • lst1.create_rectangle(0,20,200,700,fill="ivory",outline="ivory")
  • lst1.grid(row=0,column=4,rowspan=30)
  • lst1.create_text(100,10,text="Historique :")
  • lst1.create_line(74,17,126,17)
  • onInit()
  • root.mainloop()
# -*- coding: cp1252 -*-
# Grapheur mathématique
# Ecrit et immaginé par Amaury

from math import *
from Tkinter import *
import tkMessageBox 
ux=0
global select,h,m
save=[]
h=30
m=50
select="black"
def onInit():
    global xmin,xmax,ymin,ymax,pasx,pasy,save
    h=30
    m=50
    lst1.create_rectangle(0,20,200,700,fill="ivory",outline="ivory")
    can.create_rectangle(0,0,700,700,fill="white",outline="white")
    try:
            xmin=float(eval(ent1.get()))
    except SyntaxError:
            xmin=-10
    try:
            xmax=float(eval(ent2.get()))
    except SyntaxError:
            xmax=10
    try:
            pasx=float(eval(ent3.get()))
    except SyntaxError:
            pasx=1
    try:
            ymin=float(eval(ent4.get()))
    except SyntaxError:
            ymin=-10
    try:
            ymax=float(eval(ent5.get()))
    except SyntaxError:
            ymax=10
    try:
            pasy=float(eval(ent6.get()))
    except SyntaxError:
            pasy=1

    dx=float(xmax-xmin)
    dy=float(ymax-ymin)
    ux=700/dx
    uy=700/dy
    uxx=(dx/700)
    #Coordonnées du O(0,0):
    xo=ux*(-xmin)
    yo=uy*ymax
    # Axes:
    can.create_line(0,yo,700,yo,fill="red")
    can.create_line(xo,0,xo,700,fill="red")
    i=xo
    j=yo
    while i>-1:
        can.create_line(i,yo-2,i,yo+2,fill="red")
        i=i-(ux*pasx)
    while j>-1:
        can.create_line(xo-2,j,xo+2,j,fill="red")
        j=j-(uy*pasy)
    i=xo
    j=yo
    while i<701:
        can.create_line(i,yo-2,i,yo+2,fill="red")
        i=i+(ux*pasx)
    while j<701:
        can.create_line(xo-2,j,xo+2,j,fill="red")
        j=j+(uy*pasy)

    try:
        onCalc(str(ent10.get()),select,xo,yo,uy,uxx,xmin)
        save=[[str(ent10.get()),select]]
        lst1.create_text(m,h,text="f(x)="+str(ent10.get()),fill=select)
        h=h+15
    except SyntaxError:
        pass
            
def onAdd():
    global select,h,m,xmin,xmax,ymin,ymax,pasx,pasy



    dx=float(xmax-xmin)
    dy=float(ymax-ymin)
    ux=700/dx
    uy=700/dy
    uxx=(dx/700)
    #Coordonnées du O(0,0):
    xo=ux*(-xmin)
    yo=uy*ymax
    # Axes:
    can.create_line(0,yo,700,yo,fill="red")
    can.create_line(xo,0,xo,700,fill="red")
    i=xo
    j=yo
    while i>-1:
        can.create_line(i,yo-2,i,yo+2,fill="red")
        i=i-(ux*pasx)
    while j>-1:
        can.create_line(xo-2,j,xo+2,j,fill="red")
        j=j-(uy*pasy)
    i=xo
    j=yo
    while i<701:
        can.create_line(i,yo-2,i,yo+2,fill="red")
        i=i+(ux*pasx)
    while j<701:
        can.create_line(xo-2,j,xo+2,j,fill="red")
        j=j+(uy*pasy)

    try:
        onCalc(str(ent10.get()),select,xo,yo,uy,uxx,xmin)
        save.append([str(ent10.get()),select])

        if h<690:
            lst1.create_text(m,h,text="f(x)="+str(ent10.get()),fill=select)
        else:
            h=30
            m=150
            lst1.create_text(m,h,text="f(x)="+str(ent10.get()),fill=select)

        h=h+15

    except SyntaxError:
        pass
    except NameError:
        onCalc(str(ent10.get()),"black",xo,yo,uy,uxx,xmin)
        if h<690:
            lst1.create_text(m,h,text="dy/dx("+str(ent10.get())+")",fill="black")
        else:
            h=30
            m=125
            lst1.create_text(m,h,text="dy/dx("+str(ent10.get())+")",fill="black")

        h=h+15    
def onCalc(fonction,couleur,xo,yo,uy,uxx,xmin):
    valeurs=[]
    a=0
    while a<701:
        x=float(xmin+(a*uxx))
        try:
            y=-eval (fonction)
            valeurs.append([x,y])
            a=a+1
        except ValueError:
            y=0
            valeurs.append([x,y])
            a=a+1
        except OverflowError:
            y=0
            valeurs.append([x,y])
            a=a+1
        except ZeroDivisionError:
            y=0
            valeurs.append([x,y])
            a=a+1    
        except NameError:
            tkMessageBox.showerror(title="Erreur",message="""Fonction " """ + str(fonction) + """" inconnue""")
            break


    a=0
    while a<700:
        local0=valeurs[a]
        local1=valeurs[a+1]
        x1=a
        x2=a+1
        y1=int((local0[1]*uy)+yo)
        y2=int((local1[1]*uy)+yo)
        can.create_line(x1,y1,x2,y2,fill=couleur)
        a=a+1
def onSelect(e):
    global select

    select=listb.get(listb.curselection())
    lab.configure(text=select)
    listb.configure(bg=select)

def onDerive():
    global select,h,m,xmin,xmax,ymin,ymax,pasx,pasy
    try:
            xmin=float(eval(ent1.get()))
    except SyntaxError:
            xmin=-10
    try:
            xmax=float(eval(ent2.get()))
    except SyntaxError:
            xmax=10
    try:
            pasx=float(eval(ent3.get()))
    except SyntaxError:
            pasx=1
    try:
            ymin=float(eval(ent4.get()))
    except SyntaxError:
            ymin=-10
    try:
            ymax=float(eval(ent5.get()))
    except SyntaxError:
            ymax=10
    try:
            pasy=float(eval(ent6.get()))
    except SyntaxError:
            pasy=1
    onDeriv(str(ent10.get()),select)
    save.append(["derive",str(ent10.get()),select])
    if h<690:
        lst1.create_text(m,h,text="dy/dx("+str(ent10.get())+")",fill=select)
    else:
        h=30
        m=150
        lst1.create_text(m,h,text="dy/dx("+str(ent10.get())+")",fill=select)
    h=h+15

def onDeriv(fonction,couleur):
    global select,h,m
    valeurs=[]
    a=0
    
    dx=float(xmax-xmin)
    dy=float(ymax-ymin)
    ux=700/dx
    uy=700/dy
    uxx=(dx/700)
    #Coordonnées du O(0,0):
    xo=ux*(-xmin)
    yo=uy*ymax
    i=xo
    j=yo
    while a<701:
        x=float(xmin+(a*uxx))
        try:
            y=-eval (fonction)
            valeurs.append([x,y])
            a=a+1
        except ValueError:
            y=0
            valeurs.append([x,y])
            a=a+1
        except OverflowError:
            y=0
            valeurs.append([x,y])
            a=a+1
        except ZeroDivisionError:
            y=0
            valeurs.append([x,y])
            a=a+1  
        except NameError:
            tkMessageBox.showerror(title="Erreur",message="""Fonction " """ + str(fonction) + """" inconnue""")
            break
        a=a+1
    a=0
    while a<350:
        try:
            y4=y3
        except NameError:
            y4=0
        local0=valeurs[a]
        local1=valeurs[a+1]
        dy=local1[1]-local0[1]
        dx=local1[0]-local0[0]
        y3=dy/dx
        y1=int((y4*uy)+yo)
        y2=int((y3*uy)+yo)
        can.create_line(2*a,y1,2*(a+1),y2,fill=couleur)
        a=a+1

def onHelp():
    tkMessageBox.showinfo(title="Syntaxe",message="""Syntaxe des fonctions usuelles pour Python:

notation usuelle <=> notation Python
log(x)<=> log(x,base)
ln(x) <=> log(x,exp(1))
Racine(x) <=> sqrt(x)
x^n <=> x**n
E(x) <=> int(x)
sin(x), cos(x) et tan(x) n'ont pas de syntaxe particulière""")

def onRefresh():
    global save,xmin,xmax,pasx,ymin,ymax,pasy
    can.create_rectangle(0,0,700,700,fill="white",outline="white")
    try:
            xmin=float(eval(ent1.get()))
    except SyntaxError:
            xmin=-10
    try:
            xmax=float(eval(ent2.get()))
    except SyntaxError:
            xmax=10
    try:
            pasx=float(eval(ent3.get()))
    except SyntaxError:
            pasx=1
    try:
            ymin=float(eval(ent4.get()))
    except SyntaxError:
            ymin=-10
    try:
            ymax=float(eval(ent5.get()))
    except SyntaxError:
            ymax=10
    try:
            pasy=float(eval(ent6.get()))
    except SyntaxError:
            pasy=1

    dx=float(xmax-xmin)
    dy=float(ymax-ymin)
    ux=700/dx
    uy=700/dy
    uxx=(dx/700)
    #Coordonnées du O(0,0):
    xo=ux*(-xmin)
    yo=uy*ymax
    # Axes:
    can.create_line(0,yo,700,yo,fill="red")
    can.create_line(xo,0,xo,700,fill="red")
    i=xo
    j=yo
    while i>-1:
        can.create_line(i,yo-2,i,yo+2,fill="red")
        i=i-(ux*pasx)
    while j>-1:
        can.create_line(xo-2,j,xo+2,j,fill="red")
        j=j-(uy*pasy)
    i=xo
    j=yo
    while i<701:
        can.create_line(i,yo-2,i,yo+2,fill="red")
        i=i+(ux*pasx)
    while j<701:
        can.create_line(xo-2,j,xo+2,j,fill="red")
        j=j+(uy*pasy)
    a=0
    g=len(save)
    while a<g:
        local=save[a]
        if len(local)==3:
            onDeriv(local[1],local[2])
        elif len(local)==2:
            onCalc(local[0],local[1],xo,yo,uy,uxx,xmin)
        a=a+1

def onZoom(facteur):
    global save,xmin,xmax,pasx,ymin,ymax,pasy
    try:
            xmin=float(eval(ent1.get()))
    except SyntaxError:
            xmin=-10
    try:
            xmax=float(eval(ent2.get()))
    except SyntaxError:
            xmax=10
    try:
            pasx=float(eval(ent3.get()))
    except SyntaxError:
            pasx=1
    try:
            ymin=float(eval(ent4.get()))
    except SyntaxError:
            ymin=-10
    try:
            ymax=float(eval(ent5.get()))
    except SyntaxError:
            ymax=10
    try:
            pasy=float(eval(ent6.get()))
    except SyntaxError:
            pasy=1
    xmin,xmax,ymin,ymax=xmin/facteur,xmax/facteur,ymin/facteur,ymax/facteur
    can.create_rectangle(0,0,700,700,fill="white",outline="white")
    dx=float(xmax-xmin)
    dy=float(ymax-ymin)
    ux=700/dx
    uy=700/dy
    uxx=(dx/700)
    #Coordonnées du O(0,0):
    xo=ux*(-xmin)
    yo=uy*ymax
    # Axes:
    can.create_line(0,yo,700,yo,fill="red")
    can.create_line(xo,0,xo,700,fill="red")
    i=xo
    j=yo
    while i>-1:
        can.create_line(i,yo-2,i,yo+2,fill="red")
        i=i-(ux*pasx)
    while j>-1:
        can.create_line(xo-2,j,xo+2,j,fill="red")
        j=j-(uy*pasy)
    i=xo
    j=yo
    while i<701:
        can.create_line(i,yo-2,i,yo+2,fill="red")
        i=i+(ux*pasx)
    while j<701:
        can.create_line(xo-2,j,xo+2,j,fill="red")
        j=j+(uy*pasy)
    a=0
    g=len(save)
    while a<g:
        local=save[a]
        if len(local)==3:
            onDeriv(local[1],local[2])
        elif len(local)==2:
            onCalc(local[0],local[1],xo,yo,uy,uxx,xmin)
        a=a+1

def onFact():
    try:
        facteur=float(ent11.get())
    except ValueError:
        facteur=1.
    onZoom(facteur)

        
root=Tk()

can=Canvas(width=700,height=700)
can.create_rectangle(0,0,700,700,fill="white",outline="black")
can.grid (row=0,column=0,rowspan=30)

lbl1=Label(root,text="Configuration de la fenètre de traçage:")
lbl2=Label(root,text="Xmin =")
lbl3=Label(root,text="Xmax =")
lbl4=Label(root,text="Ymin =")
lbl5=Label(root,text="Ymax =")
lbl6=Label(root,text="Pas =")
lbl7=Label(root,text="Pas =")

listb=Listbox(root)
lab=Label(root,text="_")
listb.grid(row=10,column=2,rowspan=5)
lab.grid(row=10,column=1)
# Insertion des éléments dans la liste:
for  coul in  ["gray", "blue", "orange", "yellow", "green", "cyan", "red", "pink", "skyblue", "gold","green"]:
        listb.insert(END,coul)
		
# Un double click dans la liste appellera la fonction onSelect:		
listb.bind('<Double-1>',onSelect)
ent1=Entry(root)
ent2=Entry(root)
ent3=Entry(root)
ent4=Entry(root)
ent5=Entry(root)
ent6=Entry(root)
bou1=Button(root,text="Nouvelle trace",command=onInit)
bou2=Button(root,text="Quitter",command=root.quit)
bou3=Button(root,text="Ajouter trace",command=onAdd)
bou4=Button(root,text="Tracer dérivée",command=onDerive)
bou5=Button(root,text="Syntaxe",command=onHelp)
bou6=Button(root,text="Rafraichir",command=onRefresh)

bou1.grid(row=28,column=1)
bou2.grid(row=29,column=2)
bou3.grid(row=27,column=1)
bou4.grid(row=27,column=2)
bou5.grid(row=29,column=1)
bou6.grid(row=28,column=2)
lbl1.grid(row=0,column=1,columnspan=2)
lbl2.grid(row=1,column=1)
lbl3.grid(row=2,column=1)
lbl4.grid(row=4,column=1)
lbl5.grid(row=5,column=1)
lbl6.grid(row=3,column=1)
lbl7.grid(row=6,column=1)

ent1.grid(row=1,column=2)
ent2.grid(row=2,column=2)
ent3.grid(row=3,column=2)
ent4.grid(row=4,column=2)
ent5.grid(row=5,column=2)
ent6.grid(row=6,column=2)

lbl10=Label(root,text="Configuration du Grapheur:")
lbl11=Label(root,text="f(x)=")

ent10=Entry(root)


lbl10.grid(row=8,column=1,columnspan=2)
lbl11.grid(row=9,column=1)
ent10.grid(row=9,column=2)
ent11=Entry(root)
bou10=Button(root,text="Zoom x2",command=lambda arg=2.:onZoom(arg))
bou11=Button(root,text="Zoom x4",command=lambda arg=4.:onZoom(arg))
bou12=Button(root,text="Zoom x0.5",command=lambda arg=0.5:onZoom(arg))
bou13=Button(root,text="Zoom x0.25",command=lambda arg=0.25:onZoom(arg))
bou14=Button(root,text="Zoom par facteur",command=onFact)
bou10.grid(row=20,column=1)
bou11.grid(row=20,column=2)
bou12.grid(row=21,column=1)
bou13.grid(row=21,column=2)
bou14.grid(row=22,column=1)
ent11.grid(row=22,column=2)

lst1=Canvas(root,width=200,height=700)
lst1.create_rectangle(0,20,200,700,fill="ivory",outline="ivory")
lst1.grid(row=0,column=4,rowspan=30)
lst1.create_text(100,10,text="Historique :")
lst1.create_line(74,17,126,17)
onInit()

root.mainloop()

Conclusion

Très pratique si un PC portable doit remplacer une calculatrice graphique.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

23 juin 2008 20:35:07 :
Correction du beug de changement d'échelle
25 juin 2008 14:21:42 :
Un nouveau message d'erreur: "Fonction inconnue"
26 juin 2008 13:46:13 :
Apporte le choix de la couleur et un nombre de traces illimité.
26 juin 2008 14:37:32 :
Trace les dérivées
26 juin 2008 14:43:32 :
Correction beug couleur sur nouvelle trace
26 juin 2008 14:56:54 :
Ajout d'une fenetre d'aide
26 juin 2008 22:28:43 :
Permet de tracer f:x=>1/x Inclus un petit script qui permet d'utiliser le shell de python en temps que calculatrice rapidement et sans connaissances particulières (pour les néophites).
26 juin 2008 22:34:05 :
edit
27 juin 2008 13:16:49 :
Ajout d'un historique
30 juin 2008 21:57:05 :
La modification la plus importante: l'ajout d'un zoom!!! Pour l'instant, on peut uniquement zoomer par un facteur d'agrandissement. A suivre, un zoom en boite...
30 juin 2008 22:01:42 :
correction fonction rafraichir sur courbe dérivée
30 juin 2008 22:09:45 :
edit

Commentaires et avis

signaler à un administrateur
Commentaire de xeolin le 24/06/2008 02:21:45

Pourquoi donner une limitation de 6 lignes ?

Tu devrais vraiment réécrire cette partie de ton programme, Pourquoi voudrais-tu limiter qhand tu paux enlever cette limite ?

Je ne notterais pas, ton script n'est pas terminé.

signaler à un administrateur
Commentaire de aera group le 24/06/2008 09:42:09

Bonjour,

Bon, le code est assez claire, est fonctionne correctement quand l'utilisateur le fait fonctionner correctement ! MAIS ....... je pense que lorsque l'on est à sont 4ème programme et que l'on commence à s'y connaitre en Python, on peut commencer à obtimiser ses sources ! En claire, il faut commencer à mettre des sources plus "professionel" : tu as essayer de gérer les erreur avec des try/except, mais tu ne met aucun message d'erreur ! De même, j'ai essayé de tracer la fonction logarithme Néplérien Ln(x) ! Or la fonction Ln(x) ne semble pas exister sous le module math (ou elle ne s'appel pas ainsi). Mais je ne fait aucune erreur de syntaxe, je demande juste une fonction qui n'existe pas ! Ton "except SyntaxError" est K.O. par mon erreur et j'arrive a un message d'erreur qui n'aurais pas du apparaitre si tu avais obtimisé ton code !
De même que Xeolin, je me refuse de te noter tant que tu n'apportes pas d'amélioration, tu peux faire bien mieu !

Pense à bien utiliser tout Wigets les tel que Listbox
Dans ma grande bonté, je te donne un coup de pouce qui peut t'aider à faire ce que Xeolin te demande :



from Tkinter import *
import tkMessageBox


def Dialogue():
    dialogue = Toplevel(fen)
    dialogue.resizable(0,0)
    dialogue.transient(fen) # Pas icone dans la barre de tâche
    dialogue.grab_set() # Pas accès à la fenetre parent
    dialogue.wm_geometry(newGeometry='200x20+120+180')
    b = Button(dialogue,text='Quitter la boite de dialogue',command=dialogue.destroy)
    b.pack()

def Dialogue_Tk():
    if tkMessageBox.askyesno(title="Question",message="Ca va ?"):
        tkMessageBox.showinfo(title="Info",message="ok")
    else:
        tkMessageBox.showwarning(title="Attention",message="Ca va mal")
        tkMessageBox.showerror(title="Erreur",message="Rien ne va plus")


fen = Tk()
b1 = Button(fen,text='Test 1',command=Dialogue)
b2 = Button(fen,text='Test 2',command=Dialogue_Tk)
b3 = Button(fen,text='Quitter',command=fen.destroy)
b1.pack()
b2.pack()
b3.pack()

fen.mainloop()



Bon courrage, ciao !
______
Aéra

signaler à un administrateur
Commentaire de amaury74 le 24/06/2008 12:52:47

Merci pour vos avis. Vous avez entièrement raison, mon code est en cour de développement. Je l'ai poster pour le soumettre à la critique d'esprits différents du mien et, sans doute plus calés que moi en programmation. J'envisage de réduire mon code actuel, d'y ajouter d'autres fonction, comme dériver, intégrer, calculs par récurence (suites de nombres)...

Pour information, la fonction log(x) est définie par: log(x,base)=ln(x)/ln(base)
La fonction ln(x) est donc log(x,exp(1))
C'est des maths de Term S...

signaler à un administrateur
Commentaire de aera group le 24/06/2008 14:54:58

"Pour information, la fonction log(x) est définie par: log(x,base)=ln(x)/ln(base)
La fonction ln(x) est donc log(x,exp(1))"

Merci beaucoup pour ces informations !

signaler à un administrateur
Commentaire de amaury74 le 24/06/2008 22:24:00

Une petite modification à la volée:

def onCalc(fonction,couleur,xo,yo,uy,uxx,xmin):
    valeurs=[]
    a=0
    while a<701:
        x=float(xmin+(a*uxx))
        try:
            y=-eval (fonction)
            valeurs.append([x,y])
            a=a+1
        except ValueError:
            y=0
            valeurs.append([x,y])
            a=a+1
        except OverflowError:
            y=0
            valeurs.append([x,y])
            a=a+1          
        except NameError:
            tkMessageBox.showerror(title="Erreur",message="""Fonction " """ + str(fonction) + """" inconnue""")

Cependant, le fenetre d'erreur reste apres avoir cliqué sur Ok...

signaler à un administrateur
Commentaire de aera group le 25/06/2008 09:53:33

Normal, ton message d'erreur est pris dans la boucle ! Comme toutes les autres exceptions, elle est appeler 700 fois ! Met un break
  
        except NameError:
            tkMessageBox.showerror(title="Erreur",message="""Fonction " """ + str(fonction) + """" inconnue""")
            break

signaler à un administrateur
Commentaire de amaury74 le 25/06/2008 14:14:58

merci, j'avais pas vu.

signaler à un administrateur
Commentaire de amaury74 le 26/06/2008 22:32:27

Et voila, plus de limitation à 6 fonction.
On peut en plus tracer la dérivée de n'importe quelle fonction sans avoir besoin de dériver celle-ci "à la main".
J'ai utiliser pour ce faire les approximations affines des tangentes à la courbe de la fonction (pas obligatoirement tracée) pour déduire leurs coéfficients directeur.

signaler à un administrateur
Commentaire de aera group le 27/06/2008 10:07:25 9/10

Et ba voila, c'est du beau boulo, tu vois quand tu veux ....
J'aurrais mis 10/10 si tu avais sortit ce code des la première fois, je te met donc 9/10
Bravo

signaler à un administrateur
Commentaire de xeolin le 05/07/2008 18:52:46 10/10

bravo 10/10 !

Tres bon boulot, maintrnant si tu es un fou des math, pourquoi ne pas tout optimiser ? (je ne conais pas ton niveau en programmation, mais dit toi que cèst dans ce genre dàlgorithm que lòn fait le plus de progres en optimisation.

Sinon brave encore pour avoir enlever cette limite, :)

Xeolin, En vacance a Montreal

signaler à un administrateur
Commentaire de amaury74 le 10/07/2008 11:25:19

Mon niveau en programmation est assez faible; je viens de découvrir les classes...
Quand à optimiser mon programme, j'y pense mais sa structure est tellement bancale que quand je tente une modification plus rien ne vas!!!

signaler à un administrateur
Commentaire de aera group le 10/07/2008 14:04:02

Avec des Classes, il y a moyen de faire bien mieux ! Je me laisse une semaine pour ESSAYER (je suis pas sur de réusir) de créé quelque chose de plus ... optimisé !

signaler à un administrateur
Commentaire de xeolin le 11/07/2008 04:02:59

Ha Area, alors tu as installer python sur ton vista 64-bits ?

signaler à un administrateur
Commentaire de aera group le 11/07/2008 11:20:24

Oui ! j'ai ré-installer Python 2.4, je suis plus à l'aise avec, de même j'ai ré-installer WxPython (nouvelle version, avec nouveau Widgets et nouveaux bugs :( ). Il me reste encore à faire quelques test, et essayer la compilations (qui ne fonctionnera pas à mon avis, vive Windows Vista). De plus, Vista est une belle merde en sécurité, toutes les actions sont filté, surveiller et une confirmation de l'utilisateur est souvent necessaire ! En gros, il va me faloir du temps pour maitriser la bette, et heureusement, il me reste un PC avec XP (mais je n'y est pas toujours accé). Cela dis, ta source ne devré pas poser de problème à Vista.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Appel d'une fonction [ par Thomeux ] Bonjour,Je débute en python.J'essais de structurer mon Programme de la manière suivante         :Un fichier bibliothèque fonction,          :Un Fichi utiliser correctement les fonction, débutant niveaux 0+ dx [ par gwenc_hlan ] voilà, en gros, ça fait une semaine que je fait du python et en totu un peu plus de dix jours que je programme. engros : je débute.bon, voilà, je suis définir une fonction dans une fonction ? [ par gwenc_hlan ] bonjour, voilà, je cherche à faire un petit programme à interface graphiques. cependant, j'aimerais savoir s'il est possible de définir une fonction Délai avant d'exécuter une fonction [ par Crocandrew ] Bonjour, j'aimerais imposer un délai avant d'effectuer une fonction (de par exemple 20 secondes) , mais je ne sais pas comment faire . . . Merci de vo Fonction _call_func() [ par skylin3 ] Bonjour,Je cherche des informations sur la fonction _call_func(), comment l'utiliser.Merci,A bientôt. Probleme de conception [ par JoeNamat ] Bonjour a vous,Je ne suis pas un tres bon programmeur et j'ai programme une interface graphique en python avec PyGTK. Cette interface graphique interr wxWindow::RegisterHotKey [ par DoudouBidou ] Bonjour à tous(au passage Merci pour ce site, depuis le temps que je l'attends...)J'utilise wxPython pour réaliser mon interface graphique mais je n'a scrollbar dans scrollbox avec TKinter [ par MHI ] Est-ce que quelqu'un sait comment ajouter les scrollbar à une scrollbox :J'ai essayé ceci :lstFile = Tkinter.Listbox(frmMain)lstFile.place(x = 20, y = checkButton avec TKinter [ par MHI ] comment faire pour tester si un checkButton est coché ? probleme avec os.path.getctime() [ par Bl0tCh ] Voilà, Donc cette fonction est censée me donner la date de creation du fichier (en secondes) mais le probleme c ke elle me donne la premiere date de c


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et