.insert / .delete tkinter

Bonjour,

J'ai besoin d'aide : je dois créer ma propre calculatrice en python avec
tkinter
. Le problème, c'est que mes fonctions pour activer les boutons ne marchent pas (je n'ai pas le droit d'utiliser autre chose que des fonctions).

Voici mon programme:

#######################################################################
from tkinter import * # Tkinter
    
#----------
# FENETRE :
#----------
fen = Tk() # Création de a fenêtr 1e
fen.geometry("200x240") # Définition de la fenêtre
fen.title("Calculatrice v1.0") # Titre de la calculatrice
fen["bg"]= "#ffddbd" # Coleur de la fenêtre
fen["relief"] = "raised" # Profondeur de la fenêtre

#------------
#FONCTIONS  :
#------------

global operateur
def bouton_click(nbre):
    
    operateur=""
    operateur=operateur+str(nbre)

    Ecran.insert(10,operateur)
def bouton_clear():
    
    Ecran.delete(0,10000)

def bouton_egal():
    calcul=Ecran.get()
    Ecran.delete(0,10000)
    Ecran.insert(100000,eval(calcul))
    operateur=""

#------------
# PROGRAMME :
#------------

# // Ecran calculatrice //
Ecran=Entry(fen, width=28, bg ="black", fg="white", relief=SUNKEN, bd=5).place(x=9, y=8)

# // Bouttons //
B1 = Button(fen, text="1", width=3, height=2, bg="pink", fg="black", command=(lambda: bouton_click(1)))
B1.place(x=10, y=40) # Boutton 1

B2 = Button(fen, text="2", width=3, height=2, bg="pink", fg="black", command=(lambda: bouton_click(2)))
B2.place(x=50, y=40) # Boutton 2

B3 = Button(fen, text="3", width=3, height=2, bg="pink", fg="black", command=(lambda: bouton_click(3)))
B3.place(x=90, y=40) # Boutton 3

B4 = Button(fen, text="4", width=3, height=2, bg="pink", fg="black", command=(lambda: bouton_click(4)))
B4.place(x=10, y=90) # Boutton 4

B5 = Button(fen, text="5", width=3, height=2, bg="pink", fg="black", command=(lambda: bouton_click(5)))
B5.place(x=50, y=90) # Boutton 5

B6 = Button(fen, text="6", width=3, height=2, bg="pink", fg="black", command=(lambda: bouton_click(6)))
B6.place(x=90, y=90) # Boutton 6

B7 = Button(fen, text="7", width=3, height=2, bg="pink", fg="black", command=(lambda: bouton_click(7)))
B7.place(x=10, y=140) # Boutton 7

B8 = Button(fen, text="8", width=3, height=2, bg="pink", fg="black", command=(lambda: bouton_click(8)))
B8.place(x=50, y=140) # Boutton 8

B9 = Button(fen, text="9", width=3, height=2, bg="pink", fg="black", command=(lambda: bouton_click(9)))
B9.place(x=90, y=140) # Boutton 9

BC = Button(fen, text="C", width=3, height=2, bg="red", fg="black", relief=RIDGE, command=bouton_clear)
BC.place(x=10, y=190) # Boutton C (Clear)

B0 = Button(fen, text="0", width=3, height=2, bg="pink", fg="black", command=(lambda: bouton_click(0)))
B0.place(x=50, y=190) # Boutton 0


BF = Button(fen, text=".", width=3, height=2, bg="pink", fg="black", command=bouton_egal)
BF.place(x=90, y=190) # Boutton = (égale)


BP = Button(fen, text="+", width=4, height=2, bg="violet", fg="black", relief=GROOVE)
BP.place(x=150, y=40) # Boutton + (addition)

BS = Button(fen, text="-", width=4, height=2, bg="violet", fg="black", relief=GROOVE)
BS.place(x=150, y=80) # Boutton - (soustacrtion)

BD = Button(fen, text="/", width=4, height=2, bg="violet", fg="black", relief=GROOVE)
BD.place(x=150, y=120) # Boutton / (division)

BM = Button(fen, text="X", width=4, height=2, bg="violet", fg="black", relief=GROOVE)
BM.place(x=150, y=160) # Boutton X (multiplication)

BE = Button(fen, text="=", width=4, height=1, bg="blue", fg="white", relief=RIDGE)
BE.place(x=150, y=205) # Button = (égale)

fen.mainloop() 

#######################################################################


quand je lance mon programme ma calculatrice s'affiche mais quand je veux cliquer sur un bouton on me dit :
#######################################################################
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Elève\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "C:\Users\Elève\AppData\Local\Programs\Python\Python39\calculatrice tkinter.py", line 47, in <lambda>
B3 = Button(fen, text="3", width=3, height=2, bg="pink", fg="black", command=(lambda: bouton_click(3)))
File "C:\Users\Elève\AppData\Local\Programs\Python\Python39\calculatrice tkinter.py", line 22, in bouton_click
Ecran.insert(10,operateur)
AttributeError: 'NoneType' object has no attribute 'insert'
#######################################################################


Je ne comprends pas d'où vient le souci. Si quelqu'un a le temps de m'aider se serait super :-)

Merci d'avance et bonne journée

modération : Pour la mise en forme des sources, au dessus de la zone d'édition de tes messages, il y a des icônes pour l'enrichissement du texte. Celle qui a cet aspect
<> ▼
permet d'appliquer au code, suivant une liste de valeurs, le format correspondant à sa nature.
Un petit tuto là : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

3 réponses

  1. Bonjour,

    Ecran.insert(10, operateur)
    AttributeError: 'NoneType' object has no attribute 'insert'


    À mon avis, le souci, c'est que lorsque tu exécutes cette instruction,
    Ecran
    n'est pas connu (il est égal à
    None
    , d'après le message d'erreur).

    A part ça, l'indentation étant importante en Python, il faut afficher ton code avec les balises de code:
    https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
    1. Modérateur
      Bonjour,

      Merci de soigner l'orthographe, la plupart des navigateurs ont un correcteur orthographique.

      Il faut passer
      Ecran
      en paramètre de tes callbacks :

      B0 = Button(
          fen,
          text="0", width=3, height=2, bg="pink", fg="black",
          command=(lambda: bouton_click(0, Ecran))
      )


      ... pour en disposer dans la fonction appelée (ici
      bouton_click
      ) :

      def bouton_click(nbre, ecran):
          operateur = operateur + str(nbre)
          ecran.insert(10, operateur)


      Autre remarques :
      • pour suivre les conventions python,
        Ecran
        devrait s'appeler
        ecran
        (plus généralement les noms de variables sont en minuscules, les constantes en majuscules, et les noms de classe en camel case);
      • évite le mot clé
        global
        , généralement c'est une mauvaise idée ;


      Bonne chance
      1. Bonjour
        Merci d'avoir pris le temps de répondre, je n'ai pas vraiment compris votre phrase "Merci de soigner l'orthographe, la plupart des navigateurs ont un correcteur orthographique."
      2. Modérateur
        @MomoBonjour Momo,

        C'est simplement parce que dans ton message précédent, il y avait beaucoup de fautes d'orthographe qui auraient pu être évitées. Est-ce que ton problème avec les indications des messages #2 et #4 est résolu ?
    2. Bonjour Mamie,

      évite le mot clé global, généralement c'est une mauvaise idée

      C'est vrai, mais peut on, pour éviter ça, utiliser ce genre de code ? :

      class G():
          ''' classe pour variables globales '''
      
          toto = 0
      
      def une_fonction():
      
          G.toto = 10
          .....
      
      
      1. Modérateur
        Dans le cas présent, je pense que le plus simple serait de créer une classe (disons
        Calculatrice
        ) dans laquelle on stocke les pointeurs sur les différents boutons et l'attribut de classe
        operator
        .

        Voici à quoi pourrait ressembler le code (je n'ai fait qu'un bouton) :

        from tkinter import *
        
        class Calculatrice(Tk):
            def __init__(self):
                super().__init__()
                self.geometry("200x240") # Définition de la fenêtre
                self.title("Calculatrice v1.0") # Titre de la calculatrice
                self["bg"]= "#ffddbd" # Couleur de la fenêtre
                self["relief"] = "raised" # Profondeur de la fenêtre
        
                self.operator = ""
                self.ecran = Entry(self, width=28, bg ="black", fg="white", relief=SUNKEN, bd=5)
                self.ecran.place(x=9, y=8)
                self.b1 = Button(
                    self, text="1", width=3, height=2, bg="pink", fg="black",
                    command=(lambda: self.bouton_click(1))
                )
                self.b1.place(x=10, y=40) # Bouton 1
                # ...
            def bouton_click(self, data):
                print("click %r %r" % (self.operator, data))
        
        calculatrice = Calculatrice()
        calculatrice.mainloop()