Обработка нажатий нескольких кнопок с передачей самих кнопок в одну и ту же функцию

У меня есть список с кнопками. И я хочу, чтобы при нажатии на любую из этих кнопок срабатывала определенная функция, и она получала на вход саму нажатую кнопку... Вот код:

from PyQt5 import QtWidgets
from form import Ui_MainWindow
import sys


class mywindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(mywindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        button_list = [self.ui.key1, self.ui.key2, self.ui.key3]
        for button in button_list:
            button.clicked.connect(lambda:self.on_key_click(button))

    def on_key_click(self, button):
        if not button.styleSheet():
            button.setStyleSheet('background-color: #D3D3D3;')
            button.setText('')
        else:
            button.setStyleSheet('')
            button.setText('...')

app = QtWidgets.QApplication([])
application = mywindow()
application.show()

sys.exit(app.exec())

Понимаю, что вопрос баян, но кто, как ни я должен задать его еще раз


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

Автор решения: Alexander Chernin

Либо так (остальное неизменно):

button.clicked.connect(lambda btn=button:self.on_key_click(btn))

Или так:

    ...
    for ...:
        button.clicked.connect(self.on_key_click)

def on_key_click(self):
    button = self.sender()
→ Ссылка
Автор решения: S. Nick

Пожалуйста, публикуйте все модули, необходимые для воспроизведения вашего примера. Как вариант:

import sys
from PyQt5 import QtWidgets
#from form import Ui_MainWindow


class MyWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
#        self.ui = Ui_MainWindow()
#        self.ui.setupUi(self)
        self.centralwidget = QtWidgets.QWidget()
        self.setCentralWidget(self.centralwidget)
        layout = QtWidgets.QHBoxLayout(self.centralwidget)
        
        self.key1 = QtWidgets.QPushButton("key1")
        self.key2 = QtWidgets.QPushButton("key2")
        self.key3 = QtWidgets.QPushButton("key3")
#        button_list = [self.ui.key1, self.ui.key2, self.ui.key3]
        button_list = [self.key1, self.key2, self.key3]
        for button in button_list:
            button.clicked.connect(lambda ch, button=button :self.on_key_click(button))
            layout.addWidget(button)

    def on_key_click(self, button):
        #print(button.text())
        if not button.styleSheet():
            button.setStyleSheet('background-color: #D3D3D3;')
            button.setText('')
        else:
            button.setStyleSheet('')
            button.setText('...')

if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    application = MyWindow()
    application.show()
    sys.exit(app.exec_())

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

→ Ссылка