Bonjour,

lorsque je créé un menu avec sa barre de menu, je désire transmettre un argument vers une fonction avec l'instruction "lambda".

Aux lignes 19 à 24 de mon code, l'argument est transmis correctement à la fonction "action".
Aux lignes 13 à 16 de mon code (qui est une écriture plus concise que celle des lignes 19 à 24), l'argument n'est pas transmis correctement à la fonction "action".

Comment se fait-il qu'une méthode transmette l'argument correctement et pas l'autre?

Merci d'avance pour vos réponses.

Voici mon code (attention, j'utilise la version 3.x de Python):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from tkinter import *
 
class Application(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.pack()
 
        menuPrincipal = Menubutton(self, text='Fichier')
        menuPrincipal.pack(side =LEFT)
 
        me1 = Menu(menuPrincipal)
        #Méthode concise pour créér la barre de menu mais avec erreur:
        for lab, param in ( ('Débutant 1',(9,9,10)), ('Interm 1',(16,16,40)),
                         ('Expert 1',(30,16,99)) ):
            me1.add_command(label =lab,
                                command = lambda: self.action(param))
 
        #Méthode plus longue pour créér la barre de menu mais sans erreur:
        me1.add_command(label ='Débutant 2',
                        command = lambda: self.action((9,9,10)))
        me1.add_command(label ='Interm 2',
                        command = lambda: self.action((16,16,40)))
        me1.add_command(label ='Expert 2',
                        command = lambda: self.action((30,16,99)))
 
        menuPrincipal.configure(menu = me1)
 
    def action(self, param):
        print (param)
 
if __name__ == '__main__':
    Application().mainloop()