前言:我正在PyQt5中开发一个抽认卡应用程序,并且我试图让“ Enter”按钮通过调用一个函数来比较2个字符串(其中一个来自textEdit框,另一个来自列表)第二,我希望它通过调用checkanswer()函数将比较显示为“对还是错”,但是当我按下按钮并尝试让它调用另一个函数时,它会即使我试图在print(“ correct”)情况下调用nextcard(),也会从checkanswer()重复相同的行为。
这带给我的问题是:每个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_())
答案 0 :(得分:3)
首先,在Qt文档中有一个很好的介绍:
我强烈建议阅读。
在中间的某个地方,您会找到以下段落:
默认情况下,对于您进行的每个连接,都会发射一个信号。发出两个信号以进行重复连接。您可以通过单个disconnect()调用来断开所有这些连接。如果您通过Qt::UniqueConnection类型,则仅当连接不是重复时才建立连接。如果已经存在重复项(将相同的信号精确地发送到相同对象上的确切相同插槽),则连接将失败并且connect将返回
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()
上进行注释,并查看会发生什么(在控制台上)。
答案 1 :(得分:1)
正如注释中指出的 Scheff 一样,您可以调用pushButton.disconnect()
方法,然后将clicked
连接到另一个操作。
这是我固定代码的方式:
self.ui.pushButtonEnter.disconnect()
self.ui.pushButtonEnter.clicked.connect(self.checkanswer)