В PyQt4 установление соединений между слотами и сигналами является фундаментальным аспектом обработки событий. Однако при попытке соединить несколько сигналов, излучаемых кнопками, в цикле может возникнуть неожиданное поведение.
Чтобы проиллюстрировать эту проблему, рассмотрите следующий код:
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)
При нажатии любой кнопки на выходе постоянно отображается цифра «9», независимо от того, какая кнопка была нажата. Чтобы понять причину такого поведения, необходимо изучить тонкости правил области действия Python.
В Python область действия переменной определяется ближайшей охватывающей функцией. В этом примере и лямбда-функция, и функция «_number» определены внутри функции «__init__». Поскольку цикл присваивает одному и тому же значению ('9') 'i' для каждой итерации, лямбда-функция всегда фиксирует последнее значение, присвоенное 'i' в функции '__init__', то есть '9'.
Чтобы решить эту проблему, один из подходов — передать «i» в качестве аргумента ключевого слова со значением по умолчанию в лямбда-функции, гарантируя, что для каждого создается отдельная привязка «i». экземпляр.
self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
В качестве альтернативы можно использовать functools.partial для создания специализированная функция, которая связывает «i» с конкретным значением, связанным с каждым button.
self._numberButtons[i].clicked.connect(partial(self._number, i))
Эти модификации гарантируют, что каждая функция обратного вызова захватывает правильное значение 'i', включение соответствующих ответов на нажатия кнопок.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3