M. *_*uiz 2 python user-interface qt python-3.x pyqt5
前言:我正在 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_())
Run Code Online (Sandbox Code Playgroud)
首先,Qt doc中有一个很好的介绍:
我热烈推荐阅读。
在中间的某个地方,您会发现以下段落:
默认情况下,对于您建立的每个连接,都会发出一个信号;为重复连接发出两个信号。您可以通过一个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_())
Run Code Online (Sandbox Code Playgroud)
信号处理程序onBtn1Clicked()和onBtn1ClickedAgain()连接彼此互斥。
在 Windows 10 上的cygwin64 中测试:
#!/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_())
Run Code Online (Sandbox Code Playgroud)
关于信号处理程序的多次调用,我建议如下:qBtn1.clicked.disconnect()在两个处理程序中注释该行,看看会发生什么(在控制台上)。