Как переключать текст кнопки при нажатии в PyQt5 - PullRequest
1 голос
/ 08 апреля 2019

Я пытаюсь изменить текст кнопки при нажатии с использованием PyQt5.У меня есть заполненная таблица с кнопкой в ​​каждой строке.Изначально кнопка должна отображать «Play», а после нажатия должна отображаться «Pause».

Я заполняю таблицу и нажимаю кнопку, используя следующие методы:

def populate_table(self, total, my_songs):
    self.create_rows(total)
    btn_press = 0

    for row in range(total):
        for col in range(4):
            self.tableWidget.setItem(row, 0, QtWidgets.QTableWidgetItem(str(my_songs[row].get_title())
                                                                        .strip('"\'')))
            self.tableWidget.setItem(row, 1, QtWidgets.QTableWidgetItem(str(my_songs[row].get_artist())
                                                                        .strip('"\'')))
            self.tableWidget.setItem(row, 2, QtWidgets.QTableWidgetItem(str(my_songs[row].get_album())
                                                                        .strip('"\'')))
            self.tableWidget.setItem(row, 3, QtWidgets.QTableWidgetItem(str(my_songs[row].get_length())
                                                                        .strip('"\'')))
            # self.tableWidget.setItem(row, 4, QtWidgets.QPushButton('Play'))

            self.btn_play = QPushButton("Play", self)
            self.btn_play.clicked.connect(lambda: self.handle_play_button(self.btn_press))
            self.tableWidget.setCellWidget(row, 4, self.btn_play)

def handle_play_button(self, btn_press):
    button = QtWidgets.qApp.focusWidget()
    # or button = self.sender()
    index = self.tableWidget.indexAt(button.pos())
    if index.isValid():
        self.btn_press += 1
        print(index.row(), index.column(), btn_press)
        self.btn_play.setText("Pause")  #This does not work

Это показывает, какая кнопка была нажата, чтобы я мог продолжить воспроизведение песни.Следующие примеры дают здесь Я пытался использовать setText, но я не вижу видимых изменений текста.Любые предложения о том, как это можно сделать?Спасибо!

РЕДАКТИРОВАТЬ:

Ошибка от моего имени.Независимо от того, какая кнопка нажата, последняя созданная кнопка меняется на Пауза.Могу ли я использовать index.row() для индексирования нажатий кнопок для переключения?

enter image description here

1 Ответ

1 голос
/ 08 апреля 2019

Никогда не создавайте атрибут в цикле, в вашем случае self.btn_play на какую кнопку вы будете указывать?то до последнего и поэтому у нас это не работает.Кнопка, которую вы получаете с помощью focusWidget () или с отправителем, если класс является виджетом.

def populate_table(self, my_songs):
    self.tableWidget.clear()
    self.tableWidget.setColumnCount(5)
    for row, data in enumerate(my_songs):
        self.tableWidget.insertRow(self.tableWidget.rowCount())
        self.tableWidget.setItem(row, 0, QtWidgets.QTableWidgetItem(str(my_songs[row].get_title())
                                                                    .strip('"\'')))
        self.tableWidget.setItem(row, 1, QtWidgets.QTableWidgetItem(str(my_songs[row].get_artist())
                                                                    .strip('"\'')))
        self.tableWidget.setItem(row, 2, QtWidgets.QTableWidgetItem(str(my_songs[row].get_album())
                                                                    .strip('"\'')))
        self.tableWidget.setItem(row, 3, QtWidgets.QTableWidgetItem(str(my_songs[row].get_length())
                                                                    .strip('"\'')))
        btn_play = QtWidgets.QPushButton(text="Play", clicked=self.handle_play_button)
        self.tableWidget.setCellWidget(row, 4, btn_play)

@QtCore.pyqtSlot()
def handle_play_button(self):
    btn = QtWidgets.qApp.focusWidget()
    # btn = self.sender()
    if btn is not None:
        text = btn.text()
        btn.setText("Pause" if text == "Play" else "Play")
...