让QPushButton执行2个操作?

2024-09-27 02:18:36 发布

您现在位置:Python中文网/ 问答频道 /正文

前言:我正在PyQt5中开发一个flashcard应用程序,我试图让一个“Enter”按钮执行一个操作,通过调用一个函数(其中一个来自文本编辑框,另一个来自我预先编码的字符串列表)来比较两个字符串。其次,我希望它通过调用checkanswer()函数将比较显示为“对还是错”,但是当我按下按钮并试图让它调用另一个函数时,它会重复checkanswer()的相同行为。。即使我试图调用nextcard()[在print(“correct”)的情况下]

这就引出了我的问题:每个QPushButton只能执行一个操作吗?我希望它在进入下一个单词之前通知用户(或者强制他们输入正确的答案)。实际上,我需要一个按钮在不同的时间调用checkanswer()函数和nextword()方法。在

这是我主窗口的代码。。如果你需要更多的信息,请告诉我,我会在这里补充。在

class MainWindow(QtWidgets.QMainWindow):

    textvalue = ""
    cardnum = 0                                                     # intialize card number from 0
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.pushButtonEnter.clicked.connect(self.checkanswer)
        self.show()

    def checkanswer(self):
        textvalue = self.ui.lineEditAnswer.text()
        print("You entered: " + textvalue + " $? " + deck[self.cardnum].deflist[0])
        if textvalue == deck[self.cardnum].deflist[0]:
            print("Correct!")
            self.ui.lineEditAnswer.clear()
            textvalue = ""
            self.ui.labelVocab.setText("Correct!\n " + deck[self.cardnum].deflist[0])
            self.ui.pushButtonEnter.setText("Continue")
            self.ui.pushButtonEnter.clicked.connect(self.nextword)
        else:
            print("Incorrect!")
            print(self.cardnum)
            self.ui.lineEditAnswer.clear()
            self.ui.labelVocab.setText("Oops! Correct answer is: " + deck[self.cardnum].deflist[0])

    def nextword(self):
        self.cardnum += 1
        self.ui.lineEditAnswer.clear()
        self.ui.pushButtonEnter.setText("Enter")
        self.ui.labelVocab.setText(deck[self.cardnum].vocab)
        self.ui.pushButtonEnter.clicked.connect(self.checkanswer)

    if __name__ == "__main__":
        deck = parser.parser()
        app = QApplication(sys.argv)
        win = MainWindow()
        win.show()
        win.ui.labelVocab.setText(deck[MainWindow.cardnum].vocab)

        sys.exit(app.exec_())

Tags: 函数selfui按钮printdecksettextmainwindow
2条回答

首先是介绍

Signals & Slots

我强烈建议你读。在

在中间的某个地方,你会发现以下段落:

By default, for every connection you make, a signal is emitted; two signals are emitted for duplicate connections. You can break all of these connections with a single disconnect() call. If you pass the Qt::UniqueConnection type, the connection will only be made if it is not a duplicate. If there is already a duplicate (exact same signal to the exact same slot on the same objects), the connection will fail and connect will return false.

我必须承认,我不知道单曲disconnect()。通常,我存储信号处理程序的连接,当我打算以后断开连接时,connect()会返回这个连接。此外,Qt还允许通过connect()中给出的相同参数断开处理程序,但我从未使用过这种方法。在

这里是我的小Python摆弄示例:

#!/usr/bin/python3

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton

app = QApplication(sys.argv)
qBtn1 = QPushButton("Click me")
qBtn1.show()

def onBtn1Clicked():
  print("onBtn1Clicked")
  qBtn1.clicked.disconnect()
  qBtn1.setText("Click me again")
  qBtn1.clicked.connect(onBtn1ClickedAgain)

def onBtn1ClickedAgain():
  print("onBtn1ClickedAgain")
  qBtn1.clicked.disconnect()
  qBtn1.setText("Click me")
  qBtn1.clicked.connect(onBtn1Clicked)

qBtn1.clicked.connect(onBtn1Clicked)
sys.exit(app.exec_())

信号处理程序onBtn1Clicked()和{}互相连接,互斥。在

在Windows 10上的cygwin64中测试:

^{pr2}$

Snapshot of testQPushButton.pySnapshot of testQPushButton.py after clicking button

关于一个信号处理程序的多个调用,我建议如下:注释两个处理程序中的qBtn1.clicked.disconnect()行并查看发生了什么(在控制台上)。在

正如注释中指出的那样,您可以调用pushButton.disconnect()方法,然后将clicked连接到另一个操作。 我是这样修改代码的:

self.ui.pushButtonEnter.disconnect() self.ui.pushButtonEnter.clicked.connect(self.checkanswer)

相关问题 更多 >

    热门问题