pyqt:如何将按钮与不同功能相关联,具体取决于单击按钮的次数

时间:2019-02-14 13:51:26

标签: python pyqt pycharm

嘿,我试图将按钮与不同功能链接起来,我定义了一个新按钮,如下所示:第一次单击:print a;第二次打印b。但是,该代码不起作用。无论单击多少次按钮,它都只会打印“ b”。谢谢您的帮助!

def a():
    print("a")
def b():
    print("b")

class nextbutton(QPushButton):

    window.count += 1
    print(window.count)

    def function(self):
        if window.count == 1:
            ui.next4.clicked.connect(a)
        else:
            ui.next4.clicked.connect(b)

mybutton = nextbutton()
ui.next4.clicked.connect(mybutton.function)

1 个答案:

答案 0 :(得分:0)

声明位置

一个问题是,单击按钮时不会增加计数,而是在类定义中尝试这样做。

class nextbutton(QPushButton):

    window.count += 1
    print(window.count)

上面的两行仅在下​​面的行创建时执行。

mybutton = nextbutton()

要获得所需的效果,请在function方法内移动这些行,该方法会在按下按钮时接收信号。

class nextbutton(QPushButton):

    def function(self):
        window.count += 1
        print(window.count)
        if window.count == 1:
            ui.next4.clicked.connect(a)
        else:
            ui.next4.clicked.connect(b)

您可能希望将计数存储在按钮对象本身上,而不是引用窗口。这样一来,您可以拥有此按钮的多个副本,每个副本都可以跟踪其当前计数并相应地执行操作。

class nextbutton(QPushButton):

    count = 0

    def function(self):
        self.count += 1

        if self.count == 1:
            ui.next4.clicked.connect(a)
        else:
            ui.next4.clicked.connect(b)

多个信号

然而,以上仍然无法按照您的要求进行。下一节将ab函数连接到next4单击的信号。由于您可以在同一个信号上连接多个插槽,因此现在将触发3种行为-运行

        if self.count == 1:
            ui.next4.clicked.connect(a)
        else:
            ui.next4.clicked.connect(b)

请记住,如果您在这里,您已经触发了信号。您可以直接直接调用这些函数。

        if self.count == 1:
            a()
        else:
            b()
其他一些建议

以下代码令人惊讶。您的用户界面中有一个定义为ui.next4的按钮,但是在这里您要创建另一个按钮,只是为了保留用于调用另一个函数的函数。

mybutton = nextbutton()
ui.next4.clicked.connect(mybutton.function)

您可以消除nextbutton并使其本身具有功能:

def nextbutton_clicked(self):
    window.count += 1
    print(window.count)
    if window.count == 1:
        a()
    else:
        b()

然后按如下所示连接

ui.next4.clicked.connect(nextbutton_clicked)

最后,我建议将nextbutton重命名为NextButton,因为它是一门课程。这只是一个约定,但它是一个很好的学习者,因为它使您的代码更易于阅读。另外,我建议为您的方法使用一个不同的名称,该名称由按钮button_clicked或类似按钮触发。