【发布时间】:2019-04-26 01:06:43
【问题描述】:
前言:我正在开发 PyQt5 中的抽认卡应用程序,我试图让“Enter”按钮执行一个操作,通过调用一个函数来比较 2 个字符串(其中一个来自 textEdit 框,另一个来自列表我已经预先编码的字符串。)其次,我希望它通过调用 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_())
【问题讨论】:
-
我能够通过检查是否有输入并仅在 textvalue != "" 时运行 checkanswer() 函数来使其工作,但这并没有改变这样一个事实,即每次推送按钮将导致它调用该函数。有没有办法解决这个问题?
-
每个 QPushButton 可以只做一个动作吗? 不可以。您可以将多个信号处理程序连接到每个信号(包括按钮的
clicked)。如果要替换信号处理程序,则必须在连接新的之前断开旧的。 -
这很有意义,而且似乎奏效了。我希望您将其发布为答案,以便我可以将其标记为答案。我不敢相信我没有考虑过断开连接。
标签: python python-3.x qt user-interface pyqt5