Tkinter et les Buttons mystère !
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:
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:
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 !