Кнопка с 3 различными вариантами - PullRequest
0 голосов
/ 12 декабря 2018

Есть ли способ иметь кнопку с 2 вариантами?Я хочу иметь кнопку, при которой в первом варианте кнопка изменит свой цвет на красный, во втором варианте - на желтый, а в третьем - на зеленый.Повторное нажатие (в 4-й раз) начнется с начала (красный -> желтый -> зеленый).

До сих пор я могу установить кнопку только для 2 опций, но пользователь дестопаппликациия сделал, как предполагается, имеет 3 варианта.Вот мой код (FYI: кнопка находится внутри QTableWidget, поэтому для х в диапазоне):

 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 Ответ

0 голосов
/ 12 декабря 2018

Вы должны реализовать конечный автомат, в этом случае лучше создать пользовательскую кнопку.

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_())
...