tkinter bouton de commandes avec lambda en Python
j'ai essayé de chercher une solution, mais ne pouvait pas en trouver un qui fonctionne. J'ai un 2d liste de tkinter, Boutons, et je veux changer leur Texte quand on clique dessus avec la souris. J'ai essayé de faire ceci:
def create_board(number):
print(number)
for i in range (0,number):
buttonList.append([])
for j in range(0,number):
print(i,j)
buttonList[i].append(Button(root, text = " ", command = lambda: update_binary_text(i,j)))
buttonList[i][j].pack()
Puis lorsqu'il est cliqué, il appelle cette fonction:
def update_binary_text(first,second):
print(first,second)
buttonList[first][second]["text"] = "1"
Lorsque je clique sur un bouton, il n'a tout simplement rien, j'ai eu le programme d'affichage de l'index du bouton qui a été cliqué, et ils montrent TOUS 4, 4 (c'est quand la variable nombre=5) Est-il une solution à cela?
c'est mon premier python tentative de classe.
Grâce
InformationsquelleAutor vap | 2013-04-25
Vous devez vous connecter pour publier un commentaire.
Vous pouvez résoudre ce problème en créant une fermeture pour
i
etj
avec la création de chaque lambda:Vous pouvez également créer un rappel de l'usine avec des références sur le bouton objets eux-mêmes:
Et puis dans votre code d'initialisation:
Chaque fois que j'ai besoin d'une collection de widgets similaires, je trouve que c'est plus simple de les enfermer dans un objet et de passer d'un bond-méthode de rappel plutôt que de jouer des tours avec lambda. Donc, au lieu d'avoir une liste comme
buttonList[]
avec des widgets, créer un objet:Maintenant, vous avez une liste
buttonList[]
de ces objets, plutôt que de les widgets eux-mêmes. Pour mettre à jour le texte, soit de fournir une méthode pour cela, ou bien accéder à la partie directement:buttonList[i].button.configure(. . .)
Et lorsque le rappel est activé, il est l'ensemble de l'objet et quelles que soient les attributs que vous pourriez avoir besoin dansself
.