如何让 PyQt5 QPushButton 在不同的按钮点击时执行不同的命令

How to get a PyQt5 QPushButton to do different commands on different button clicks

我希望 QPushButton 在不同的点击时做不同的事情。第一次单击它应该执行一个命令,而在下一次单击时,它应该执行另一个命令。我试图编写一个程序来执行它,但它只执行一个命令,而不执行另一个

我的代码一:

import PyQt5.QtWidgets as pyqt
import sys

ongoing = False


class Stuff(pyqt.QWidget):
    def __init__(self):
        super().__init__()
        self.windows()

    def windows(self):
        w = pyqt.QWidget()
        layout = pyqt.QGridLayout()
        self.setLayout(layout)
        
        button = pyqt.QPushButton('click me', w)
        layout.addWidget(button)

        if not ongoing:
            button.clicked.connect(click_one)
        else:
            button.clicked.connect(click_two)
        self.show()
        w.show()


def click_one():
    global ongoing
    print('one')
    ongoing = not ongoing


def click_two():
    global ongoing
    print('two')
    ongoing = not ongoing


if __name__ == '__main__':
    app = pyqt.QApplication(sys.argv)
    x = Stuff()
    app.exec_()

我应该怎么做才能解决这个问题?

由于 class 初始化时 ongoing 的值为 False,按钮的点击信号连接到 click_one()。将按钮连接到一个初始插槽,然后根据 ongoing.

的值调用所需的函数
class Stuff(pyqt.QWidget):
    def __init__(self):
        super().__init__()
        self.windows()

    def windows(self):
        w = pyqt.QWidget()
        layout = pyqt.QGridLayout()
        self.setLayout(layout)
        
        button = pyqt.QPushButton('click me', w)
        layout.addWidget(button)

        button.clicked.connect(on_click)
        self.show()
        w.show()

def on_click():
    global ongoing
    if not ongoing:
        click_one()
    else:
        click_two()

我建议用属于 class 的函数和 ongoing 变量重写代码。分配给变量 w 的 QWidget 似乎是多余的,因为 QPushButton 然后被添加到 class 的布局中,所以它的父级无论如何都会改变。

class Stuff(pyqt.QWidget):
    
    def __init__(self):
        super().__init__()
        self.ongoing = False
        self.windows()

    def windows(self):
        layout = pyqt.QGridLayout(self)
        button = pyqt.QPushButton('click me')
        layout.addWidget(button)
        button.clicked.connect(self.on_click)
        self.show()

    def on_click(self):
        self.click_one() if not self.ongoing else self.click_two()
        self.ongoing = not self.ongoing

    def click_one(self):
        print('one')

    def click_two(self):
        print('two')

您可能也有兴趣使用 checkable button