Maison >développement back-end >Tutoriel Python >Comment puis-je transmettre correctement les variables de boucle aux commandes des boutons Tkinter ?

Comment puis-je transmettre correctement les variables de boucle aux commandes des boutons Tkinter ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-24 17:56:10174parcourir

How Can I Pass Loop Variables Correctly to Tkinter Button Commands?

Passer des variables de boucle aux commandes de boutons Tkinter

Dans Tkinter, créer des boutons dans une boucle peut être simple. Cependant, transmettre des arguments spécifiques à la commande de chaque bouton peut devenir délicat.

Considérez le scénario suivant dans lequel vous tentez de créer trois boutons avec les titres « Jeu 1 » à « Jeu 3 ». Vous avez l'intention de transmettre la valeur numérique correspondante à l'argument de la commande afin que lorsqu'un bouton est enfoncé, vous puissiez identifier quel bouton a déclenché l'action.

def createGameURLs(self):
    self.button = []
    for i in range(3):
        self.button.append(Button(self, text='Game '+str(i+1),
                                  command=lambda: self.open_this(i)))
        self.button[i].grid(column=4, row=i+1, sticky=W)

def open_this(self, myNum):
    print(myNum)

Malheureusement, ce code ne fonctionne pas comme prévu. Lorsqu'un bouton est enfoncé, la valeur imprimée est toujours 2, la dernière itération de la boucle. Le problème se pose car la fonction lambda utilise la valeur de i à la fin de la boucle, et non sa valeur à la création de chaque bouton.

Le Miracle de Fermeture

Pour résoudre ce problème, vous besoin de créer une fermeture autour de la commande de chaque bouton. Ceci peut être réalisé en utilisant la syntaxe lambda i=i : self.open_this(i).

def createGameURLs(self):
    self.button = []
    for i in range(3):
        self.button.append(Button(self, text='Game '+str(i+1),
                                  command=lambda i=i: self.open_this(i)))
        self.button[i].grid(column=4, row=i+1, sticky=W)

Avec cette modification, la commande de chaque bouton capture la valeur spécifique de i au moment de sa création. Lorsqu'un bouton est enfoncé, la fermeture garantit que la valeur correcte de i est transmise à la fonction open_this.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn