Bonjour,

j'étais en train de coder un petit dialog tout ce qu'il y a de plus simple en Tkinter quand je suis tombé sur un comportement des plus mystérieux !

Voici la bête (tout est dans les commentaires) :
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
33
34
35
36
37
38
39
#coding:cp1252
 
# affiche une boîte de dialogue simple : 
#  - une listbox contenant un texte de quelques lignes 
#  - des boutons qui lancent des actions sur ce texte
def main_menu ( lines,buttons ):
    import Tkinter
    root = Tkinter.Tk()
    # la listbox
    listbox = Tkinter.Listbox( root )
    for f in lines : listbox.insert( Tkinter.END,f )
    listbox.pack()
    # les boutons = paires ( libélé , fonction )
    for name,func in buttons :
        print name,func # quelques traces pour vérifier
        butt = Tkinter.Button( root,text = name,command = lambda : func( lines ))
        butt.pack()
    # et c'est parti !
    root.mainloop()
 
def message ( *t ) : # ch'tite fonction qui ne fait pas grand chose... 
    print t
 
# 10 lignes de texte sans intèret
lines = ['-- %d '%i+'-'*i for i in xrange( 10 )]
 
# liste de paires ( libellé du bouton , fonction associée )]
buttons  = [('button %d'%i , lambda l : message( 'Button %d'%i,l[i:i+2] )) for i in xrange( 5 )]
 
# appel du dialog
main_menu( lines,buttons ) #---> tous les boutons lancent la même fonction (la dernière)
 
# peut-être qu'il n'aime pas un tableau de lambdas construites à la volée ?
# Ok, je définis mes fonctions une par une :  
def s1 ( l ) : message( 's1',l[0] )
def s2 ( l ) : message( 's2',l[0:2] )
def s3 ( l ) : message( 's3',l[1:5] )
buttons2 = [('s1',s1),('s2',s2),('s3',s3)]
main_menu( lines,buttons2 ) #---> idem !!!
Je lance mon machin et clique sur chaque bouton : voici les traces que j'obtiens sur la console :
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
button 0 <function <lambda> at 0x02AC4470>
button 1 <function <lambda> at 0x02AC43F0>
button 2 <function <lambda> at 0x02AC4630>
button 3 <function <lambda> at 0x02AC4670>
button 4 <function <lambda> at 0x02AC46B0>
('Button 4', ['-- 4 ----', '-- 5 -----'])
('Button 4', ['-- 4 ----', '-- 5 -----'])
('Button 4', ['-- 4 ----', '-- 5 -----'])
('Button 4', ['-- 4 ----', '-- 5 -----'])
('Button 4', ['-- 4 ----', '-- 5 -----'])
s1 <function s1 at 0x02AC4AF0>
s2 <function s2 at 0x02AC46F0>
s3 <function s3 at 0x02AC4530>
('s3', ['-- 1 -', '-- 2 --', '-- 3 ---', '-- 4 ----'])
('s3', ['-- 1 -', '-- 2 --', '-- 3 ---', '-- 4 ----'])
('s3', ['-- 1 -', '-- 2 --', '-- 3 ---', '-- 4 ----'])
Comme on le voit, les fonctions passées à Button sont bien différentes mais seule la dernière semble appelée...

Quelqu'un y comprend-il quelque chose ?

Merci d'avance !