Действия у кнопок, созданных в цикле for

Проблема заключается в следующем, есть вот такой код:

class Test(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setWindowTitle('Test')
        self.main = QVBoxLayout()

        for q in range(10):
            layout = QHBoxLayout()
            for i in range(10):
                butt = QPushButton(f'Button{str(q)}{str(i)}')
                butt.setFixedSize(100, 80)
                butt.clicked.connect(lambda: self.test(butt.text()))
                layout.addWidget(butt)
            self.main.addLayout(layout)
        self.setLayout(self.main)

    def test(self, text):
        print(text)

Но при нажатии на любую из кнопок программа почему-то невозмутимо выводит в консоль название последней кнопки, Button99.


Ответы (1 шт):

Автор решения: S. Nick

Один из вариантов правильного использования функции lambda для вашего примера - выглядит так:

butt.clicked.connect(lambda ch, text=butt.text(): self.test(text))

from PyQt5.Qt import *


class Test(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Test')
        
        self.layout_main = QVBoxLayout(self)

        for q in range(10):
            layout = QHBoxLayout()
            for i in range(10):
                butt = QPushButton(f'Button{str(q)}{str(i)}')
                butt.setFixedSize(70, 50)
                butt.clicked.connect(lambda ch, text=butt.text(): self.test(text))
                layout.addWidget(butt)
            self.layout_main.addLayout(layout)

    def test(self, text):
        print(text)
        

if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    main = Test()
    main.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка