Pourquoi mes boutons PyQt4 impriment-ils tous la même valeur lorsqu'ils sont connectés en boucle ?

Mary-Kate Olsen
Libérer: 2024-11-11 17:22:03
original
505 Les gens l'ont consulté

Why Do My PyQt4 Buttons All Print the Same Value When Connected in a Loop?

Connexion des emplacements et des signaux dans PyQt4 dans une boucle : rompre la chaîne de liaison

Dans cet article, nous abordons un problème courant rencontré lors de la connexion clicked() signaux à partir de boutons créés dans une boucle dans PyQt4. Notre objectif est de comprendre pourquoi tous les boutons affichent la même valeur, même si l'on s'attend à ce que chaque bouton déclenche une action unique en fonction de son étiquette.

Comprendre la portée et la fermeture

Le comportement observé dans l'exemple fourni est une conséquence des mécanismes de portée et de fermeture de Python. Lors de la création de boutons dans une boucle, nous essayons de connecter leurs signaux clicked() à une fonction lambda. Cependant, Python introduit uniquement de nouvelles liaisons dans un espace de noms via des listes d'affectations ou de paramètres de fonctions.

Par conséquent, la fonction lambda n'a pas sa propre liaison pour la variable de boucle i, et la recherche à la place dans l'espace de noms de la fonction englobante, __init__(). Au moment où le lambda est exécuté, sa valeur finale de 9 a déjà été attribuée à i, ce qui fait que tous les boutons impriment la même sortie.

Résolution

À adresser ce problème, nous pouvons passer i comme argument de mot-clé avec une valeur par défaut à la fonction lambda. Cela garantit que i dans le lambda est indépendant de i dans __init__(). Alternativement, nous pouvons utiliser la fonction functools.partial, qui propose une approche plus lisible et moins « magique » pour obtenir le même résultat.

Exemple avec argument de mot clé :

self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
Copier après la connexion

Exemple avec functools.partial :

self._numberButtons[i].clicked.connect(partial(self._number, i))
Copier après la connexion

En mettant en œuvre l'une de ces approches, nous pouvons réussir à établir la liaison souhaitée entre chaque bouton et son action respective.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal