«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему сигнал нажатия кнопки PyQt4 всегда выводит одно и то же значение в цикле?

Почему сигнал нажатия кнопки PyQt4 всегда выводит одно и то же значение в цикле?

Опубликовано 16 ноября 2024 г.
Просматривать:418

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

Соединение слотов и сигналов в PyQt4 внутри цикла

В 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