Maison >développement back-end >Tutoriel Python >Comment connecter dynamiquement les emplacements et les signaux dans PyQt4 sans comportement inattendu ?

Comment connecter dynamiquement les emplacements et les signaux dans PyQt4 sans comportement inattendu ?

DDD
DDDoriginal
2024-11-11 19:50:03848parcourir

How to Connect Slots and Signals Dynamically in PyQt4 Without Unexpected Behavior?

Connexion dynamique des emplacements et des signaux dans PyQt4

Dans PyQt4, la connexion par programme de plusieurs emplacements à des signaux peut entraîner un comportement inattendu lorsqu'elle est effectuée dans une boucle .

Problème :

Envisagez de créer une calculatrice avec des boutons numériques générés dynamiquement dans une boucle. Si le signal 'cliqué()' de chaque bouton est connecté comme suit :

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

Problème :

Lorsque l'on clique sur un bouton, ils impriment tous '9 '. Ce comportement découle de la sémantique de portée et de fermeture de Python. L'expression lambda fait référence à la variable i, qui, dans la boucle, est évaluée à la valeur finale, « 9 ».

Solution :

Pour éviter ce problème, transmettez i comme argument de mot-clé avec une valeur par défaut :

self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))

Vous pouvez également utiliser functools.partial pour une approche plus propre :

self._numberButtons[i].clicked.connect(partial(self._number, i))

Ces solutions isolent i dans l'expression lambda, garantissant que chaque le bouton déclenche l'action prévue lorsqu'il est cliqué.

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