在 PyQt5 中按下时如何切换按钮文本 [英] How to toggle button text when pressed in PyQt5

查看:65
本文介绍了在 PyQt5 中按下时如何切换按钮文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在使用 PyQt5 按下时更改按钮文本.我有一个填充表,每行都有一个按钮.最初按钮应显示播放",按下后应显示暂停".

我使用以下方法填充表格并处理按钮按下:

def populate_table(self, total, my_songs):self.create_rows(总计)btn_press = 0对于范围内的行(总计):对于范围(4)中的col:self.tableWidget.setItem(row, 0, QtWidgets.QTableWidgetItem(str(my_songs[row].get_title()).条('"\'')))self.tableWidget.setItem(row, 1, QtWidgets.QTableWidgetItem(str(my_songs[row].get_artist()).条('"\'')))self.tableWidget.setItem(row, 2, QtWidgets.QTableWidgetItem(str(my_songs[row].get_album()).条('"\'')))self.tableWidget.setItem(row, 3, QtWidgets.QTableWidgetItem(str(my_songs[row].get_length()).条('"\'')))# self.tableWidget.setItem(row, 4, QtWidgets.QPushButton('Play'))self.btn_play = QPushButton("播放", 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):按钮 = QtWidgets.qApp.focusWidget()# 或 button = self.sender()index = self.tableWidget.indexAt(button.pos())如果 index.isValid():self.btn_press += 1打印(索引.行(),索引.列(),btn_press)self.btn_play.setText("Pause") #这个不行

这会指示我按下了哪个按钮,以便我可以继续播放歌曲.按照示例给出

解决方案

永远不要在循环中创建属性,在您的情况下 self.btn_play 您会指向哪个按钮?然后到最后,因此它对我们不起作用.如果类是小部件,则使用 focusWidget() 或使用 sender 获取它的按钮.

def populate_table(self, my_songs):self.tableWidget.clear()self.tableWidget.setColumnCount(5)对于行,枚举(my_songs)中的数据:self.tableWidget.insertRow(self.tableWidget.rowCount())self.tableWidget.setItem(row, 0, QtWidgets.QTableWidgetItem(str(my_songs[row].get_title()).条('"\'')))self.tableWidget.setItem(row, 1, QtWidgets.QTableWidgetItem(str(my_songs[row].get_artist()).条('"\'')))self.tableWidget.setItem(row, 2, QtWidgets.QTableWidgetItem(str(my_songs[row].get_album()).条('"\'')))self.tableWidget.setItem(row, 3, QtWidgets.QTableWidgetItem(str(my_songs[row].get_length()).条('"\'')))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()如果 btn 不是 None:text = btn.text()btn.setText("Pause" if text == "Play" else "Play")

I am trying to change button text when pressed using PyQt5. I have a populated table with a button in each row. Initially the button should display "Play" and once pressed it should display "Pause".

I populate the table and handle button press using the following methods:

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

This gives me indication which button was pressed so I can proceed to play the song. Following the examples give here I tried using setText, but I see no visible text change. Any suggestions on how this can be done? Thanks!

EDIT:

Mistake on my behalf. Irrespective of which button is pressed, the last button that was created changes to Pause. Can I use index.row() to somehow index the button presses to toggle?

解决方案

Never create an attribute in a loop, in your case self.btn_play which button will you point to? then to the last and therefore it does not work for us. The button you get it using focusWidget() or with sender if the class is a widget.

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

这篇关于在 PyQt5 中按下时如何切换按钮文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆