Как мне изменить название одинаковых кнопок?

У меня есть кнопка "Добавить", при нажатии на которую создается другая кнопка. Таких кнопок может быть n количество.

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

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

group.py:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(893, 539)
        self.scrollArea = QtWidgets.QScrollArea(Dialog)
        self.scrollArea.setGeometry(QtCore.QRect(10, 10, 551, 521))
        self.scrollArea.setWidgetResizable(True)
        self.scrollArea.setObjectName("scrollArea")
        self.scrollAreaWidgetContents = QtWidgets.QWidget()
        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 549, 519))
        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents)
        self.verticalLayout.setObjectName("verticalLayout")
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(610, 30, 236, 31))
        self.pushButton.setMinimumSize(QtCore.QSize(0, 0))
        self.pushButton.setStyleSheet("QPushButton:hover {\n"
"     background-color: rgb(218, 218, 218);\n"
" }\n"
"\n"
"QPushButton {\n"
"     border-width: 2px;\n"
"    border-style: outset;\n"
"    border-color: black;\n"
" }\n"
"\n"
"QPushButton:pressed {\n"
"          \n"
"    \n"
"    \n"
"    background-color: rgb(195, 195, 195);\n"
" }")
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.pushButton.setText(_translate("Dialog", "добавить"))

main_group.py:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from group import Ui_Dialog

count = [1]

class main_window(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

        self.ui.pushButton.clicked.connect(self.create)
    
    def create(self):
        self.button = QtWidgets.QPushButton('Button {}'.format(count[-1]),self)
        self.ui.verticalLayout.addWidget(self.button)
        self.button.clicked.connect(self.change)
        
        count.append(count[-1] + 1)

    def change(self):
        print(self.button.setText("измененно"))
        

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mywin = main_window()
    mywin.show()
    sys.exit(app.exec_())

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

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

Это делается так

...
    #                                 vvvvvvvvvv              vvv
    button.clicked.connect(lambda ch, btn=button: self.change(btn))
...


def change(self, btn):
    print(btn.setText("измененно"))

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

#from group import Ui_Dialog
class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(893, 539)
        self.scrollArea = QtWidgets.QScrollArea(Dialog)
        self.scrollArea.setGeometry(QtCore.QRect(10, 10, 551, 521))
        self.scrollArea.setWidgetResizable(True)
        self.scrollArea.setObjectName("scrollArea")
        self.scrollAreaWidgetContents = QtWidgets.QWidget()
        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 549, 519))
        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents)
        self.verticalLayout.setObjectName("verticalLayout")
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(610, 30, 236, 31))
        self.pushButton.setMinimumSize(QtCore.QSize(0, 0))
        self.pushButton.setStyleSheet("QPushButton:hover {\n"
"     background-color: rgb(218, 218, 218);\n"
" }\n"
"\n"
"QPushButton {\n"
"     border-width: 2px;\n"
"    border-style: outset;\n"
"    border-color: black;\n"
" }\n"
"\n"
"QPushButton:pressed {\n"
"          \n"
"    \n"
"    \n"
"    background-color: rgb(195, 195, 195);\n"
" }")
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.pushButton.setText(_translate("Dialog", "добавить"))
        

#count = [1]

class MainWindow(QtWidgets.QWidget, Ui_Dialog):
    count = [1]
    
    def __init__(self, parent=None):
        super().__init__(parent)
#        self.ui = Ui_Dialog()
        self.setupUi(self)

        self.pushButton.clicked.connect(self.create)
    
    def create(self):
        button = QtWidgets.QPushButton('Button {}'.format(self.count[-1]),self)
        self.verticalLayout.addWidget(button)
        button.clicked.connect(lambda ch, btn=button: self.change(btn))
        
        self.count.append(self.count[-1] + 1)

    def change(self, btn):
        print(btn.setText("измененно"))
        

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mywin = MainWindow()
    mywin.show()
    sys.exit(app.exec_())

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

→ Ссылка