Maison >développement back-end >Tutoriel Python >Comment éviter les problèmes de fermeture Lambda lors de l'attribution de commandes de bouton dans une boucle Tkinter For ?

Comment éviter les problèmes de fermeture Lambda lors de l'attribution de commandes de bouton dans une boucle Tkinter For ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-18 07:44:17178parcourir

How to Avoid Lambda Closure Issues When Assigning Button Commands in a Tkinter For Loop?

Tkinter Assign Button Command dans une boucle For avec Lambda

Dans Tkinter, vous pouvez rencontrer un scénario dans lequel vous devez créer plusieurs boutons de manière dynamique à l'aide d'une boucle for, tout en chaque bouton doit être associé à une commande unique. Cependant, si vous utilisez directement la variable de boucle dans l'expression lambda pour la commande, vous pourriez être confronté à un problème potentiel.

Considérez le code suivant :

users = {"Test": "127.0.0.0", "Test2": "128.0.0.0"}
row = 1
for name in users:
    user_button = Tkinter.Button(self.root, text=name,
                                 command=lambda: self.a(name))
    user_button.grid(row=row, column=0)
    row += 1

Ici, l'intention est de créez des boutons avec des valeurs de paramètres uniques pour chaque utilisateur. Cependant, une fois exécutés, tous les boutons appelleront la méthode a() avec la dernière valeur assignée de name, ce qui entraînera l'impression de "Test2" par chaque bouton.

Pour résoudre ce problème, vous pouvez exploiter les paramètres de mot-clé par défaut dans le expression lambda. En attribuant la valeur actuelle de name à un nouveau paramètre, vous créez une fonction unique pour chaque itération :

user_button = Tkinter.Button(self.root, text=name,
                             command=lambda name=name: self.a(name))

Cela garantit que chaque bouton a sa propre instance de la fonction lambda avec le paramètre name correspondant. En conséquence, les boutons appelleront correctement la méthode a() avec leurs paramètres prévus.

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