Erreur dans mon programme

Thomae Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   -

 Est ce que quelqu'un peux m'aider, je dois faire un programme qui demande à l'utilisateur de rentrer une fonction polynome du second degré, qui lui affiches ses racines et la courbe représentative de cette fonction. Il y a une erreur, pourriez vous m'aider à la régler : 

Traceback (most recent call last):
  File "C:\Users\Desktop\Polynome du second degré.py", line 76, in <module>
    y = f(x)
  File "C:\Users\Desktop\Polynome du second degré.py", line 73, in f
    return a * x**2 + b * x + c
NameError: name 'a' is not defined

from tkinter import *
from math import *
import matplotlib.pyplot as plt
import numpy as np

# Création et personalisation de la fenêtre
fenetre = Tk()
fenetre.title("Polynome du second degré") 
fenetre.geometry("662x400")

fenetre.config(background="#1E1E70")

# Le titre
titre = Label(fenetre, text="Entrez la fonction :",font=("Courrier", 19), bg="#1E1E70", fg="white")
titre.place(x=234,y=50)

# Les entrees de l'utilisateur
entree_a = Entry(fenetre, font=("Courrier", 15), bg ='white', fg='black', width=3)
entree_a.place(x=245,y=95)
entree_b = Entry(fenetre, font=("Courrier", 15), bg ='white', fg='black', width=3)
entree_b.place(x=320,y=95)
entree_c = Entry(fenetre, font=("Courrier", 15), bg ='white', fg='black', width=3)
entree_c.place(x=387,y=95)

def résolution_eq():
    a = float(entree_a.get().strip())
    b = float(entree_b.get().strip())
    c = float(entree_c.get().strip())

    delta = b**2-4*a*c
    
    #Affichage des solutions
    if delta < 0 :
        solution1 = Label(fenetre, text=f"            Δ = {delta}            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution1.place(x=200,y=205)
        solution1_1 = Label(fenetre, text=f"            donc l'équation {a}x²+{b}x+{c} = 0            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution1_1.place(x=88,y=240)
        solution1_2 = Label(fenetre, text="            ne possède pas de solution            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution1_2.place(x=94,y=275)
        
    elif delta == 0 :
        x0 = round((-b)/2*a,2)
        solution2 = Label(fenetre, text="            Δ = 0            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution2.place(x=200,y=205)
        solution2_1 = Label(fenetre, text=f"donc la solution unique de l'équation {a}x²+{b}x+{c} = 0                         ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution2_1.place(x=24,y=240)
        solution2_2 = Label(fenetre, text=f"            est x0 = {x0}            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution2_2.place(x=155,y=275)
        
    elif delta > 0 :
        x1 = round(((-b)-sqrt(delta))/(2*a),2)
        x2 = round(((-b)+sqrt(delta))/(2*a),2)
        solution3 = Label(fenetre, text=f"            Δ = {delta}            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution3.place(x=200,y=205)
        solution3_1 = Label(fenetre, text=f"            donc l'équation {a}x²+{b}x+{c} = 0 possède            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution3_1.place(x=24,y=240)
        solution3_2 = Label(fenetre, text=f"            deux solutions : x1 = {x1}, et x2 = {x2}            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution3_2.place(x=18,y=275)
        

# Le texte de la fonction
fonction0 = Label(fenetre, text="x²+",font=("Courrier", 19), bg="#1E1E70", fg="white")
fonction0.place(x=282,y=89)
fonction0_1 = Label(fenetre, text="x+",font=("Courrier", 19), bg="#1E1E70", fg="white")
fonction0_1.place(x=357,y=89)

# Création du bouton résolution 
Bouton_résolution = Button(fenetre, text = "Résolution de l'équation",font=("Courrier", 16), fg="#161651", command=résolution_eq)
Bouton_résolution.place(x=212,y=145)


def f(x):
    return a * x**2 + b * x + c

x = np.linspace(-10, 10, 100)
y = f(x)

fig, ax = plt.subplots()
ax.plot(x, y)
ax.axhline(0, color='black', lw=1)
ax.axvline(0, color='black', lw=1)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_title(f"Courbe représentative de la fonction {a}x²+{b}x+{c}")
ax.grid(True)
plt.show()

# Affichage de la page
fenetre.mainloop()

Merci

5 réponses

jee pee Messages postés 41517 Date d'inscription   Statut Modérateur Dernière intervention   9 717
 

Bonjour,

a est définie dans resolution_eq(), elle n'est pas visible dans f()

voir la portée des variables : https://www.pierre-giraud.com/python-apprendre-programmer-cours/portee-variable/


0
Thomae Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 

Merci,

Je l'ai corrigé, mais maintenant, il y a un autre probleme :  

Traceback (most recent call last):
  File "C:\Users\Desktop\Polynome du second degré.py", line 79, in <module>
    y = f(x)
  File "C:\Users\Desktop\Polynome du second degré.py", line 76, in f
    return a*x**2 + b*x+c
numpy.core._exceptions._UFuncNoLoopError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U1'), dtype('float64')) -> None

from tkinter import *
from math import *
import matplotlib.pyplot as plt
import numpy as np

# Création et personalisation de la fenêtre
fenetre = Tk()
fenetre.title("Polynome du second degré") 
fenetre.geometry("662x400")

fenetre.config(background="#1E1E70")

# Le titre
titre = Label(fenetre, text="Entrez la fonction :",font=("Courrier", 19), bg="#1E1E70", fg="white")
titre.place(x=234,y=50)

# Les entrees de l'utilisateur
entree_a = Entry(fenetre, font=("Courrier", 15), bg ='white', fg='black', width=3)
entree_a.place(x=245,y=95)
entree_b = Entry(fenetre, font=("Courrier", 15), bg ='white', fg='black', width=3)
entree_b.place(x=320,y=95)
entree_c = Entry(fenetre, font=("Courrier", 15), bg ='white', fg='black', width=3)
entree_c.place(x=387,y=95)

def résolution_eq():
    a = float(entree_a.get().strip())
    b = float(entree_b.get().strip())
    c = float(entree_c.get().strip())

    delta = b**2-4*a*c
    
    #Affichage des solutions
    if delta < 0 :
        solution1 = Label(fenetre, text=f"            Δ = {delta}            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution1.place(x=200,y=205)
        solution1_1 = Label(fenetre, text=f"            donc l'équation {a}x²+{b}x+{c} = 0            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution1_1.place(x=88,y=240)
        solution1_2 = Label(fenetre, text="            ne possède pas de solution            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution1_2.place(x=94,y=275)
        
    elif delta == 0 :
        x0 = round((-b)/2*a,2)
        solution2 = Label(fenetre, text="            Δ = 0            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution2.place(x=200,y=205)
        solution2_1 = Label(fenetre, text=f"donc la solution unique de l'équation {a}x²+{b}x+{c} = 0                         ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution2_1.place(x=24,y=240)
        solution2_2 = Label(fenetre, text=f"            est x0 = {x0}            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution2_2.place(x=155,y=275)
        
    elif delta > 0 :
        x1 = round(((-b)-sqrt(delta))/(2*a),2)
        x2 = round(((-b)+sqrt(delta))/(2*a),2)
        solution3 = Label(fenetre, text=f"            Δ = {delta}            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution3.place(x=200,y=205)
        solution3_1 = Label(fenetre, text=f"            donc l'équation {a}x²+{b}x+{c} = 0 possède            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution3_1.place(x=24,y=240)
        solution3_2 = Label(fenetre, text=f"            deux solutions : x1 = {x1}, et x2 = {x2}            ",font=("Courrier", 19), bg="#1E1E70", fg="white")
        solution3_2.place(x=18,y=275)
        

# Le texte de la fonction
fonction0 = Label(fenetre, text="x²+",font=("Courrier", 19), bg="#1E1E70", fg="white")
fonction0.place(x=282,y=89)
fonction0_1 = Label(fenetre, text="x+",font=("Courrier", 19), bg="#1E1E70", fg="white")
fonction0_1.place(x=357,y=89)

# Création du bouton résolution 
Bouton_résolution = Button(fenetre, text = "Résolution de l'équation",font=("Courrier", 16), fg="#161651", command=résolution_eq)
Bouton_résolution.place(x=212,y=145)


def f(x):
    a = entree_a.get()
    b = entree_b.get()
    c = entree_c.get()
    return a*x**2 + b*x+c

x = np.linspace(-10, 10, 100)
y = f(x)

fig, ax = plt.subplots()
ax.plot(x, y)
ax.axhline(0, color='black', lw=1)
ax.axvline(0, color='black', lw=1)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_title(f"Courbe représentative de la fonction {a}x²+{b}x+{c}")
ax.grid(True)
plt.show()

# Affichage de la page
fenetre.mainloop()
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 

Bonjour,

dans la fonction f, a,b,c sont des string, il faut les convertir avant de les multiplier

De plus tu as mis tes définitions de Labels dans la fonction, donc à chaque fois que tu l'appelle,

tu recrées ces Labels !

from tkinter import *
from math import *
import matplotlib.pyplot as plt
import numpy as np

def résolution_eq():
    a = float(entree_a.get().strip())
    b = float(entree_b.get().strip())
    c = float(entree_c.get().strip())

    delta = b**2-4*a*c
    
    #Affichage des solutions
    if delta < 0 :
        solution1['text'] = f"            ? = {delta}            "
        solution1_1['text'] = "            donc l'équation {a}x²+{b}x+{c} = 0            "
        solution1_2['text'] = "            ne possède pas de solution            "
    elif delta == 0 :
        #idem
        
    elif delta > 0 :
        #idem

def f(x):
    return a * x**2 + b * x + c

fenetre = Tk()
fenetre.title("Polynome du second degré") 
fenetre.geometry("662x400")
fenetre.config(background="#1E1E70")

titre = Label(fenetre, text="Entrez la fonction :",font=("Courrier", 19), bg="#1E1E70", fg="white")
titre.place(x=234,y=50)

entree_a = Entry(fenetre, font=("Courrier", 15), bg ='white', fg='black', width=3)
entree_a.place(x=245,y=95)

entree_b = Entry(fenetre, font=("Courrier", 15), bg ='white', fg='black', width=3)
entree_b.place(x=320,y=95)

entree_c = Entry(fenetre, font=("Courrier", 15), bg ='white', fg='black', width=3)
entree_c.place(x=387,y=95)

fonction0 = Label(fenetre, text="x²+",font=("Courrier", 19), bg="#1E1E70", fg="white")
fonction0.place(x=282,y=89)

fonction0_1 = Label(fenetre, text="x+",font=("Courrier", 19), bg="#1E1E70", fg="white")
fonction0_1.place(x=357,y=89)

Bouton_résolution = Button(fenetre, text = "Résolution de l'équation",font=("Courrier", 16), fg="#161651", command=résolution_eq)
Bouton_résolution.place(x=212,y=145)

solution1 = Label(fenetre, text='',font=("Courrier", 19), bg="#1E1E70", fg="white")
solution1.place(x=200,y=205)

solution1_1 = Label(fenetre, text='',font=("Courrier", 19), bg="#1E1E70", fg="white")
solution1_1.place(x=88,y=240)

solution1_2 = Label(fenetre, text='',font=("Courrier", 19), bg="#1E1E70", fg="white")
solution1_2.place(x=94,y=275)

x = np.linspace(-10, 10, 100)
y = f(x)

fig, ax = plt.subplots()
ax.plot(x, y)
ax.axhline(0, color='black', lw=1)
ax.axvline(0, color='black', lw=1)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_title(f"Courbe représentative de la fonction {a}x²+{b}x+{c}")
ax.grid(True)
plt.show()

fenetre.mainloop()
0
Thomae Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 

Comment faut-il que je fasse pour remplacer les Labels par des nouveaux au lieu d'en creer d'autres ?

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 

regarde ma réponse précédente, je t'ai affiché le code à jour !

les labels sont créés et placés avec les autres widgets après la création de la fenêtre

et les textes sont mis à jour dans la fonction resolution_eq:

 
solution1['text'] = f"            ? = {delta}            "
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 

de plus, je t'ai remis tout ça dans l'ordre:

1_ les imports

2_ les définition de fonctions

3_ la création de la fenêtre

4_ la création de widgets

5_ fenetre.mainloop()

dans la fonction f(x), tu n'as plus qu'a ajouter les float(entree_a.get....

0