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()
