Maison > développement back-end > Tutoriel Python > Pourquoi mon signal cliqué sur le bouton PyQt4 génère-t-il toujours la même valeur dans une boucle ?

Pourquoi mon signal cliqué sur le bouton PyQt4 génère-t-il toujours la même valeur dans une boucle ?

DDD
Libérer: 2024-11-13 04:08:09
original
695 Les gens l'ont consulté

Why Does My PyQt4 Button Clicked Signal Always Output the Same Value Within a Loop?

Connexion des slots et des signaux dans PyQt4 dans une boucle

Dans PyQt4, l'établissement de connexions entre les slots et les signaux est un aspect fondamental de la gestion des événements. Cependant, lorsque vous tentez de connecter plusieurs signaux émis par des boutons dans une boucle, un comportement inattendu peut survenir.

Pour illustrer ce problème, considérez le code suivant :

def __init__(self):
    for i in range(0, 10):
        self._numberButtons += [QPushButton(str(i), self)]
        self.connect(self._numberButtons[i], SIGNAL('clicked()'), lambda: self._number(i))

def _number(self, x):
    print(x)
Copier après la connexion

En cliquant sur l'un des boutons boutons, la sortie affiche systématiquement « 9 », quel que soit le bouton enfoncé. Comprendre la raison de ce comportement implique d'explorer les subtilités des règles de portée de Python.

En Python, la portée d'une variable est déterminée par la fonction englobante la plus proche. Dans cet exemple, la fonction lambda et la fonction « _number » sont définies dans la fonction « __init__ ». Puisque la boucle attribue la même valeur (« 9 ») à « i » pour chaque itération, la fonction lambda capture toujours la dernière valeur attribuée à « i » dans la fonction « __init__ », qui est « 9 ».

Pour résoudre ce problème, une approche consiste à passer « i » comme argument de mot-clé avec une valeur par défaut dans la fonction lambda, en garantissant qu'une liaison distincte de « i » est créée pour chaque exemple.

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

Alternativement, functools.partial peut être utilisé pour créer une fonction spécialisée qui lie « i » à la valeur spécifique associée à chaque bouton.

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

Ces modifications garantissent que chaque fonction de rappel capture la valeur correcte de « i », permettant des réponses appropriées aux clics sur les boutons.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal