Как переключить текст кнопки при нажатии в PyQt5

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

Как переключить текст кнопки при нажатии в PyQt5

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

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(), чтобы как-то проиндексировать нажатие кнопки для переключения?

Как переключить текст кнопки при нажатии в PyQt5

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
2 556
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Никогда не создавайте атрибут в цикле, в вашем случае 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")

Спасибо, это работает, как и ожидалось. Но я получаю два неожиданных аргумента-предупреждения в btn_play = QtWidgets.QPushButton(text = "Play", clicked=self.handle_play_button). Я не уверен, почему это происходит

rrz0 08.04.2019 14:31

@Rrz0 попробуйте изменить на: btn_play = QtWidgets.QPushButton("Play") btn_play.clicked.connect(self.handle_play_button)

eyllanesc 08.04.2019 14:32

Да, вернусь к предыдущему синтаксису, спасибо. Я также думаю, что команда self.tableWIdget.clear() удаляет ранее установленные имена столбцов, поэтому я буду комментировать это. (Просто указатель для будущих ссылок)

rrz0 08.04.2019 14:33

Другие вопросы по теме