Erreur dans mon programme

 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

  • Votes
  • Date
  • Date décroissante
  1. 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}            "
    1. 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....

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

    1. 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()
      1. 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()