【问题标题】:PyQt: Getting which button called a specific functionPyQt:获取调用特定功能的按钮
【发布时间】:2016-08-17 20:33:17
【问题描述】:

我在 PyQt 中做了一个 Multi-Page 应用程序,一般是一个问答游戏。

所以现在每当用户犯错或正确回答问题时,它都会调用正确/错误函数。


错误答案功能:

def incorrect(self):
    self.pic3.hide()
    self.que1.hide()
    self.answ.hide()
    self.answ1.hide()
    self.answ2.hide()
    self.pic4.setGeometry(0, 0, 1280, 800)
    self.pic4.show()
    self.goback.show() 
    self.cont = QtGui.QPushButton(self)
    self.cont.setObjectName('cont')
    self.cont.setStyleSheet("#cont {background-image: url(':/images/Continue.png'); border: none; }"
    "#cont:hover { background-image: url(':/images/Continue1.png'); }"
    "#cont:pressed { background-image: url(':/images/Continue2.png'); }")
    self.cont.setGeometry(980, 610, 300, 300)
    self.cont.clicked.connect(self.question2)
    self.cont.show()
    self.heart2.hide()
    #self.heart1.hide()
    if ( self.heart2.isHidden() and self.heart1.isHidden() ):
        gameover()
    else:
        pass

所以我要在这个函数中制作多个“cont”小部件,这样做的目的是因为我希望它继续特定的问题(如果用户在 问题 1 失败或成功,它应该继续问题 2)。

但是为此,应该有一个代码来确定是从 button1 还是 button2 调用错误的答案功能,两个按钮在单击时连接到同一个插槽,如果它从 button1 调用,它将显示 cont 按钮,单击时会显示 question2 小部件(Question2 页面)。

但是如果它是从button2调用的,它会显示cont2按钮,点击时会显示问题3页面。

在代码中应该是这样的

if self.connected from button1:
   cont.show()
if self.connected from button2:
   cont2.show()
else:
    pass

图片示例:

【问题讨论】:

  • @neuronet 这不是一个“骗子”,这些问题很难理解,因为它们是针对某个问题的特定目标的,我只是让它对我和读者来说更笼统和容易理解,使用对其他人有用的图片、示例代码和一般问题。
  • 嗯...不相信。实际上,您的问题似乎非常针对您正在处理的问题,而这些问题似乎简洁地达到了一般性。我很难看到这里有什么独特之处。特别是考虑到您接受的答案基本相同......

标签: python pyqt pyqt4


【解决方案1】:

使用sender()函数获取已发送信号的QObject:

class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        btn1 = QPushButton("Button 1", self)
        btn1.clicked.connect(self.buttonClicked) # connect signal to slot

        self.setWindowTitle('Event sender')
        self.show()

    def buttonClicked(self):
        sender = self.sender()  # This is what you need
        self.statusBar().showMessage(sender.text() + ' was pressed')

【讨论】:

  • 是的,但我如何将它包含在布尔值中?所以它确定它是来自 btn_1 还是 btn_2。
  • 假设你有你的按钮对象:(sender == my_button)
【解决方案2】:

假设您的按钮被命名为self.button1self.button2,您可以使用partially bound functions 绑定您的事件处理程序:

from functools import partial
self.button1.clicked.connect(partial(self.question, self.button1))
self.button2.clicked.connect(partial(self.question, self.button2))

然后在你的question方法中取另一个参数,即

def question(self, btn):
     if btn == self.button1:
         # Button 1 was clicked
     elif btn == self.button2:
         # Button 2 was clicked

【讨论】:

  • 成功了!但它一直在控制台TypeError: incorrect() takes exactly 2 arguments (1 given) 中出现此错误,但我这样定义不正确:def incorrect(self, sendercheck):
  • 除了partial函数和sender函数外,还可以使用QSignalMapper,非常方便....正如在cmets中链接的假定重复项中讨论的那样。
猜你喜欢
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多