@Andreyyyyyyyyy

Как решить проблему с взаимодействием Python + PyQT Designer?

Здравствуйте, пишу игру крестики-нолики на python в качестве внешнего интерфейса использую PyQt, а конкретнее QT Designer. В дезайнере создал поле 9х9 при помощи кнопок и столкнулся со следующей проблемой: я могу вызывать функцию при нажатии конкретной кнопки, у каждой кнопки своё имя, соответственно, чтобы поле реагировало на нажатия мне нужно прописывать вызов функции для нажатия каждой кнопки и по новой функции для этих нажатий, делать это с полем 9х9 довольно-таки проблематично. Как сделать, чтобы скрипт реагировал на нажатие любой кнопки и вызывать общую функцию, затем по названию кнопки определять ячейку на поле, не прописывая сценарий действий для каждой из кнопок. Есть ли другой способ реализовать эту идею?
  • Вопрос задан
  • 214 просмотров
Пригласить эксперта
Ответы на вопрос 2
Zoominger
@Zoominger Куратор тега Python
System Integrator
Есть.
Генерируете кнопки в коде, циклом навешиваете на каждую connect и нужное действие, определяя нажатую кнопку через QObjectName.
Почитайте про QSignalMapper, может помочь.
Ответ написан
Комментировать
@bbkmzzzz
То есть добавлять 91 кнопку руками не лень было?)
Как-то так можно:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton


class Main(QWidget):
    def __init__(self):
        super(Main, self).__init__()

        # список в котором будут кнопки
        self.buttons = []

        #  компоновщик "сетка"
        self.grid = QGridLayout()
        self.setLayout(self.grid)

        for row in range(9):
            for column in range(9):
                btn = QPushButton()
                #
                btn.setObjectName(f'QPushButton_{row}_{column}')
                self.buttons.append(btn)

                #  добавляем кнопку на сетку в позицию строка, столбец
                self.grid.addWidget(btn, row, column)

                #  связываем сигнал со слотом
                btn.clicked.connect(self._onButtonClick)

    def _onButtonClick(self):
        #  self.sender() - то, что породило сигнал
        print(f'click on {self.sender().objectName()} button')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Main()
    ex.show()
    sys.exit(app.exec_())
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы