pyqt:如何根据单击的次数将按钮与不同的功能链接起来

问题描述 投票:0回答:1

嘿我试图用不同的功能链接我的按钮,我定义了一个新的按钮如下:第一次点击:打印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)
python pyqt pycharm
1个回答
0
投票

Statement position

一个问题是,单击按钮时您没有递增计数,而是尝试在类定义中执行此操作。

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)

Multiple signals

然而,上面仍然无法按你想要的方式工作。以下部分将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()
Some other suggestions

您的代码的下列内容令人惊讶。您在UI中定义了一个按钮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或类似物触发。

© www.soinside.com 2019 - 2024. All rights reserved.