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)
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))
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))
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!