PyQt5, как узнать какая кнопка активировала метод?

Есть окно с кнопками, которые создаются динамически, их количество невозможно предсказать.

При нажатии каждая из них, активирует функцию foo.

Как внутри функции foo узнать какая кнопка её активировала? Желательно узнать надпись на кнопке.

import sys

from PyQt5.QtWidgets import QVBoxLayout, QPushButton, QWidget, QApplication


def foo():
    print('button name')

prg = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout()
names = ['one','two','three']
for i in names:
    btn = QPushButton(i)
    btn.clicked.connect(foo)
    layout.addWidget(QPushButton(i))
window.setLayout(layout)
window.show()

sys.exit(prg.exec())

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

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

Как вариант:

from PyQt5.QtWidgets import QVBoxLayout, QPushButton, QWidget, QApplication


def foo(name):                                                   # +++ name
    print(f'button name -> {name}')

prg = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout()
names = ['one','two','three']

for i in names:
    btn = QPushButton(i)
    btn.clicked.connect(lambda ch, name=i: foo(name))           # + lambda ch, name=i: foo(name)
#    layout.addWidget(QPushButton(i))                           # --- 
    layout.addWidget(btn)
    
window.setLayout(layout)
window.show()

sys.exit(prg.exec())

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

→ Ссылка
Автор решения: gil9red

Как вариант, используйте метод sender (но нужно помнить о предупреждениях указанных в документации), чтобы узнать кто активировал этот метод:

import sys
from PyQt5.QtWidgets import QVBoxLayout, QPushButton, QWidget, QApplication


def foo():
    button = QApplication.instance().sender()
    print(button.text())


app = QApplication(sys.argv)

window = QWidget()
layout = QVBoxLayout()
names = ['one', 'two', 'three']

for i in names:
    btn = QPushButton(i)
    btn.clicked.connect(foo)
    layout.addWidget(btn)

window.setLayout(layout)
window.show()

app.exec()

Или используйте QButtonGroup, чтобы сгруппировать логически кнопки и иметь возможность ловить в сигнале какая кнопка была кликнута:

import sys
from PyQt5.QtWidgets import QVBoxLayout, QPushButton, QWidget, QApplication, QButtonGroup


def foo(button):
    print(button.text())


app = QApplication(sys.argv)

window = QWidget()
layout = QVBoxLayout()
names = ['one', 'two', 'three']

button_group = QButtonGroup()
button_group.buttonClicked.connect(foo)

for i in names:
    btn = QPushButton(i)
    button_group.addButton(btn)
    layout.addWidget(btn)

window.setLayout(layout)
window.show()

app.exec()
→ Ссылка