Ошибка метода PyQt connect при использовании в цикле for, который создает виджеты из списка

StackOverflow https://stackoverflow.com/questions/736651

  •  09-09-2019
  •  | 
  •  

Вопрос

У меня есть программа с графическим интерфейсом,

Он автоматически создает кнопки из списка имен, а подключение к функции выводит ее название.

но когда я запускаю эту программу, я нажимаю все кнопки,

все они возвращают название последней кнопки.

Интересно, почему это происходит.кто-нибудь может помочь?

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import logging

logging.basicConfig(level=logging.DEBUG,)

class MainWindow(QWidget):
    def init(self):
        names = ('a','b','c')
        lo = QHBoxLayout(self)
        for name in names:
            button = QPushButton(name,self)
            lo.addWidget(button)
            self.connect(button,SIGNAL("clicked()"),
                         lambda :logging.debug(name))

if __name__=="__main__":
    app = QApplication(sys.argv)
    m = MainWindow();m.init();m.show()
    app.exec_() 

результат, подобный:

python t.py
DEBUG:root:c
DEBUG:root:c
DEBUG:root:c
Это было полезно?

Решение

Я вижу по крайней мере одну ошибку в вашем коде.

Заменить:

 lambda :logging.debug(name)

Автор::

 lambda name=name: logging.debug(name)

Видишь Почему результаты map() и понимания списка отличаются? для получения подробной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top