.insert / .delete tkinter

Fermé
Momo - Modifié le 22 mars 2022 à 15:05
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 8 avril 2022 à 16:56
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

Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 22 mars 2022 à 15:06
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 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
Modifié le 22 mars 2022 à 15:12
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
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 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812 > Momo
Modifié le 8 avril 2022 à 16:56
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 lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 24 mars 2022 à 14:50
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 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
24 mars 2022 à 15:32
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