Erreur dans mon programme

Thomae Messages postés 3 Statut Membre -  
Phil_1857 Messages postés 1883 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

  1. Thomae Messages postés 3 Statut Membre
     

    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
  2. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    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
  3. Thomae Messages postés 3 Statut Membre
     

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

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

    Posez votre question
  5. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    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
    1. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
       

      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