为了账号安全,请及时绑定邮箱和手机立即绑定

具有 3 个不同选项的按钮

具有 3 个不同选项的按钮

MMMHUHU 2021-09-14 21:13:07
有没有办法让按钮有两个选项?我想要一个按钮,在选项一上,按钮会将颜色更改为红色,在选项二上更改为黄色,在选项 3 上更改为绿色。再次按下(第 4 次)将从头开始(红色 --> 黄色 --> 绿色)。到目前为止,我只能为 2 个选项设置按钮,但是我制作的 destopapplication 的用户应该有 3 个选项。到目前为止,这是我的代码(仅供参考:按钮在 QTableWidget 内,因此 for x 在范围内): for x in range(cell_num):        self.button = QPushButton(' ',self)        self.button.setFlat(True)        self.table.setCellWidget(x, 5, self.button)  # lights_button        self.button.clicked.connect(            lambda state, w=self.table.cellWidget(x, 5), r=x, c=5: self.button_pushed(w, r, c)        )  def button_pushed(self, w, r, c):        if w.text() != " ":            w.setIcon(QIcon("..\image\green_button.png"))            w.setText(" ")        elif w.text() == "Likes/UnLikes/Normal":            w.setIcon(QIcon("..\image\yellow_button.png"))            w.setText(" Likes/Normal")        else:            w.setIcon(QIcon("..\image\darkred_button.png"))            w.setText("  ")
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

您必须实现一个状态机,在这种情况下最好创建一个自定义按钮。


from itertools import cycle

from PyQt5 import QtCore, QtGui, QtWidgets


class Button(QtWidgets.QPushButton):

    RedState, YellowState, GreenState = range(3)


    def __init__(self, *args, **kwargs):

        super(Button, self).__init__(*args, **kwargs)

        self._current_state = Button.RedState

        self._states = cycle([Button.RedState, Button.YellowState, Button.GreenState])

        self.on_clicked()

        self.clicked.connect(self.on_clicked)


    def update_button(self):

        if self._current_state == Button.RedState:

            self.setIcon(QtGui.QIcon(r"..\image\green_button.png"))

            self.setText(" ")

        elif self._current_state == Button.YellowState:

            self.setIcon(QtGui.QIcon(r"..\image\yellow_button.png"))

            self.setText(" Likes/Normal")

        elif self._current_state == Button.GreenState:

            self.setIcon(QtGui.QIcon(r"..\image\darkred_button.png"))

            self.setText("  ")


    @QtCore.pyqtSlot()

    def on_clicked(self):

        self._current_state = next(self._states)

        self.update_button()


class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, parent=None):

        super(MainWindow, self).__init__(parent)


        self.table = QtWidgets.QTableWidget(10, 10)

        self.setCentralWidget(self.table)


        for x in range(self.table.rowCount()):

            button = Button(flat=True)

            self.table.setCellWidget(x, 5, button)


if __name__ == '__main__':

    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = MainWindow()

    w.show()

    sys.exit(app.exec_())



查看完整回答
反对 回复 2021-09-14
  • 1 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号