Soyez le premier à donner votre avis sur cette source.
Snippet vu 7 226 fois - Téléchargée 17 fois
# -*- coding: cp1252 -*- #correction du code de http://www.pythonfrance.com/codes/CALCULATRICE-SIMPLICISTE-SOUS-TKINTER_50496.aspx #que je vous invite à aller voir, comme ce qui peut être nécessaire si on ne connait pas lambda #je suis passé de 180 lignes à 25 (si on enlève les commentaires) from Tkinter import* chain="" #ici on aura une action qui dépend du bouton qui à appelé cette fonction def func(b): global chain if b=="C":chain="0" elif b=="=":chain=eval(chain) else : chain+=b z.set(chain) fen = Tk() fen.title('Calculatrice') a="" i=1 j=1 #ici est la partie la plus importante. for a in ["0","1","2","3","4","5","6","7","8","9","+","-","*","/",".","=","C"]: Button(fen,text = a, command=lambda b=a:func(b)).grid(column=i,row=j) j+=1 # if j==5:j,i=1,i+1 #ma manière à moi d'organiser rapidement mes boutons #je vais décomposer : #dans un premier temps on va créer une liste de tout les boutons avec leur nom. #afin d'éviter de créer une quinzaine de fonction, on va vouloir que chaque bouton #bouton appèlent cette même fonction en donnant aussi leur nom #par example, le bouton 8 appèlera la fonction func("8") # #Cependant, on ne peut pas dire : #Button(fen,text = a, command=func(a)) #ça éxécuterai func(a) à la création du bouton, et donnerai None en fonction.. # #C'est ici qu'intervient le lambda, fonction asser simple mais irremplassable : #lambda b=a:func(b) retourne une fonction, func(a) #et comme on le voulait le boutton reverra son nom. #cella évitera de créer quinze fonctions. #et d'avoir un code de 180 lignes au lieu de 25 z = StringVar() entree=Entry(fen,textvariable=z) entree.grid(row=0) z.set(chain) Button(fen,text='Quitter',command = fen.quit).grid(row=1) fen.mainloop()
Pourquoi la syntaxe de lambda doit etre ici de la forme lambda b=a:func(b) et pas de la forme habituelle lambda a:func(a) ? l'interpreteur se plaigant que l'on ne passe pas d'argument a lambda?
en fait la syntaxe lambda x=y:func(x) permet l'appel direct de la fonction resultante sans lui passer le parametre a traiter. Voila le detail:
def func(b):
return (b*2)
a=100
d=lambda a:func(a)
print d(100) #appel avec d() impossible
c =(lambda x:func(x))(a)
print c #resultat en utilisant la valeur de "a" directement mais "c" variable et non plus fonction
e= lambda p=a:func(p)
print e() #syntaxe permettqnt d'appeller la fonction e() directement avec la valeur de "a" sans la passer en parametre
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.