Fonction lambda dans widget Button

Résolu/Fermé
Damien - Modifié le 26 mars 2022 à 13:00
 C_Dedev - 27 mars 2022 à 20:45
Bonjour,

Je rencontre un problème de syntaxe dans le programme suivant:


from tkinter import *

root=Tk()

btn= Button(root,text='My Button',command=(lambda x:x.destroy())(btn) )
btn.pack()


root.mainloop()


Pouvez-vous me dire comment rédiger ça svp ?

8 réponses

Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 26 mars 2022 à 13:33
Bonjour,
btn= Button(root,text='My Button',command=(lambda x:x.destroy())(btn) )


(btn) 
: btn n'est pas encore défini puisque tu es en train de le définir dans cette même instruction (btn = Button...)
0
je crois savoir d'ou vient le problème pour définir une première fois
btn

tu utilise la variable
btn
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 26 mars 2022 à 13:52
Ben oui, c'est le serpent qui se mord la queue...

Il faut un 2eme bouton pour détruire btn, et pas besoin de lambda:
root=Tk()
root.geometry('500x200')

btn= Button(root,text='My Button')
btn.pack(pady = 20)

bt= Button(root,text='Détruis My Button',command= btn.destroy)
bt.pack(pady = 20)

root.mainloop()
0
D'accord je comprends maintenant. Merci à vous et bonne journée !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
voilà une solution

from tkinter import *

root=Tk()

btn = Button()
def command():
    (lambda x: x.destroy())(btn)
btn = Button(root,text='My Button',command=command)
btn.pack()


root.mainloop()

#Script by C Dedev


Ton problème était que tu utilisait pour créer ta variable cette meme variable qui n'existait pas encore.
Donc il falait la définir une première fois puis la modifier.
Quand a la fonction elle palie a un autre problème que tu aurait eu en mettant le simple code dans la variable.
0
Merci C_Dedev pour ta solution.

Est-ce qu'il est possible de passer un argument dans command de telle sorte à ce que la fonction command serve à plusieurs boutons différents (une seule fonction pour plusieurs boutons) ?
0
C_Dedev > Damien
27 mars 2022 à 10:36
si j'ai bien compris tu veux que plusieurs boutons différents activent la meme fonction.
oui il suffit juste de mettre le meme
command=command
dans un autre bouton
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
27 mars 2022 à 20:32
@ C-Dedev:
pourquoi écrire
(lambda x: x.destroy())(btn)

et pas
btn.destroy()
?
0
C_Dedev > yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024
27 mars 2022 à 20:45
j'ai réutilisé sa commande sans me poser de question
(et vous l'aviez déja corrigé la dessus)
0
from tkinter import *

root=Tk()

btn0 = Button()
btn1 = Button()
def command():
    (lambda x: x.destroy())(btn0)
btn0 = Button(root,text='My Button',command=command)
btn1 = Button(root,text='My Button',command=command)
btn0.pack()
btn1.pack()


root.mainloop()

#Script by C Dedev


voilà pour toi .Là les deux boutons font exactement la meme chose (supprimer le bouton 0) mais si tu veux que chacun se détruise lui meme tu peux toujours faire une autre fonction
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
27 mars 2022 à 11:33
bonjour,
peut-être ainsi:
import tkinter 
root=tkinter.Tk()
btn= tkinter.Button(root,text='My Button1')
btn.configure(command=btn.destroy )
btn.pack()
root.mainloop()
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
Modifié le 27 mars 2022 à 11:44
Plus généralement, si tu veux utiliser la même fonction pour plusieurs boutons, tout en passant à la fonction l'identité du bouton, ou un paramètre spécifique au bouton:
import tkinter 
def delbout(b):
    b.destroy()
root=tkinter.Tk()
btn1= tkinter.Button(root,text='My Button1')
btn1.configure(command=(lambda: delbout(btn1) ) )
btn1.pack()
btn2= tkinter.Button(root,text='My Button2')
btn2.configure(command=(lambda: delbout(btn2) ) )
btn2.pack()
root.mainloop()
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
27 mars 2022 à 11:48
Si tu veux passer un paramètre autre que le bouton lui-même, c'est encore plus simple:
import tkinter 
def printbout(b):
    print(b)
root=tkinter.Tk()
btn1= tkinter.Button(root,text='My Button1',command=(lambda: printbout(1) ))
btn1.pack()
btn2= tkinter.Button(root,text='My Button2',command=(lambda: printbout(2) ))
btn2.pack()
root.mainloop()
1
Oui voilà, c'est exactement ce dont j'avais besoin. Merci à tous !
0