J'aimerais définir des boutons à travers une boucle (j'ai 64 boutons à placer en 8x8 pour un plateau de jeu) grâce au module Tkinter.
J'ai déjà pu définir les boutons et leur afficher l'image correspondante (qui varie en fonction du bouton), cependant, la commande exécutée lors du clic sur un bouton doit dépendre du bouton sur lequel on a cliqué. Malheureusement, l'action effectuée est TOUJOURS celle du dernier bouton (en effet, la variable self.i évolue au fil des créations de bouton).
Il faut bien comprendre que, lorsqu’à l’intérieur de la fonction lambda, l’interpréteur rencontre self, cette variable n’est pas déclarée et donc il va chercher dans le scope du dessus. Au moment de l’éxecution de la fonction, l’interpréteur va chercher self dans le scope du dessus, et trouve self.i qui contient la dernière valeur que l’on y a mise, et il fait cela pour chaque fonction. Pour ’capturer’ la valeur d’une variable dans le scope de la fonction, il faut faire :
# ne marche pas
fs = []
for i in range(10):
fs.append(lambda : print(str(i)))
for f in fs: f()
# marche
fs = []
for i in range(10):
fs.append(lambda i=i: print(str(i)))
for f in fs: f()
merci beaucoup, j'avoue que je ne suis pas très habitué aux fonctions lambda, j'ai été obligé d'en utiliser une pour passer un argument dans la commande de mon bouton, mais sans réellement me pencher dessus et comprendre le fonctionnement.
Encore merci, j'ai compris mon erreur !
Tkinter - Boutons dans une boucle
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
typage structurel ftw