.insert / .delete tkinter

Momo -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
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
A voir également:

3 réponses

Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
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
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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
0
Momo
 
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."
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882 > Momo
 
Bonjour 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 ?
0
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
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
    .....

0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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()
0