Maison >développement back-end >Tutoriel Python >Pourquoi l'utilisation d'expressions Lambda avec les emplacements PyQt entraîne-t-elle un comportement inattendu ?
Utilisation d'expressions Lambda pour connecter des emplacements dans PyQt
Dans PyQt, les expressions lambda peuvent être utilisées pour connecter des signaux aux emplacements. Cependant, l'utilisation d'expressions lambda dans certains scénarios peut entraîner un comportement inattendu.
Considérez le code suivant :
class MainWindow(QtGui.QWidget): def __init__(self): ... self.buttons = [] for idx in [3, 4]: button = QtGui.QPushButton('Button {} auto'.format(idx), self) button.clicked.connect(lambda x=idx: self.button_pushed(x)) self.buttons.append(button) main_layout.addWidget(button)
Lorsque l'on clique sur les boutons, au lieu de recevoir les valeurs attendues de 3 et 4 , la méthode button_pushed reçoit False.
La raison de ce comportement est que le signal cliqué de QPushButton émet un argument qui indique l'état du bouton. Lors de l'utilisation d'une expression lambda dans le slot, la valeur attribuée (telle que x=idx dans ce cas) est écrasée par l'argument émis.
Pour résoudre ce problème, l'expression lambda doit ignorer l'état du bouton et utiliser un paramètre nommé supplémentaire :
button.clicked.connect(lambda state, x=idx: self.button_pushed(x))
Cette modification garantit que la valeur correcte est transmise à la méthode button_pushed, quel que soit l'état du bouton.
Comprendre le mécanisme des expressions lambda est également crucial. Dans le contexte des connexions par slot, la fonction lambda n'est pas évaluée lorsque le signal se déclenche. Au lieu de cela, un pointeur vers la fonction (avec les paramètres substitués) est connecté au signal. Lorsque le signal est émis, la fonction connectée est appelée avec les arguments transmis par le signal.
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!