Действия у кнопок, созданных в цикле 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_())
