Skip to main content
 首页 » 编程设计

python之让 QPushButton 执行 2 个操作

2025年05月04日23daizhj

前言:我正在 PyQt5 中开发一个抽认卡应用程序,我试图让“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_()) 

请您参考如下方法:

首先,Qt 文档中有一个很好的介绍:

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() 和 onBtn1ClickedAgain() 相互连接,互斥。

测试于 cygwin64在 Windows 10 上:

$ /usr/bin/python3 --version 
Python 3.6.4 
 
$ ./testQPushButton.py 
onBtn1Clicked 
onBtn1ClickedAgain 
onBtn1Clicked 
onBtn1ClickedAgain 

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