#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()
команда удаляет ранее установленные имена столбцов, поэтому я буду комментировать это. (Просто указатель для будущих ссылок)