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

#python #python-3.x #user-interface #pyqt #pyqt5

#python #python-3.x #пользовательский интерфейс #pyqt #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() , чтобы каким-то образом индексировать нажатия кнопок для переключения?

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

Ответ №1:

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

 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")
  

Комментарии:

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

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

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