连接到带参数的函数

时间:2015-02-18 02:37:10

标签: python qt user-interface pyqt

我正在使用PyQt开发用户界面,并最终找到了如何使多个显示选项成为可能(用户点击单选按钮,保存信号,并根据该信号运行不同的功能用户点击"显示")。我遇到了这条错误消息:

TypeError: connect() slot argument should be a callable or a signal, not 'NoneType'

我认为这与我将带有参数的函数传递到" connect"的事实有关。方法。以下是我所看到的代码块,简而言之:

from PyQt4 import QtCore, QtGui
import sys
import myFunctions


try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_ROIGUI(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setupUi(self)

def setupUi(self, ROIGUI):
    #sets up radio buttons and display button in AnalyzeDisplay tab
    #i can post more if needed but I haven't messed with it much

    self.buttonGroup = QtGui.QButtonGroup(self.AnalyzeDisplay)
    self.buttonGroup.addButton(self.radiobutton1,1)
    self.buttonGroup.addButton(self.radiobutton2,2)

def retranslateUi(self, ROIGUI):
    self.Display.clicked.connect(self.readSignal)

def readSignal(self):
    signal = self.buttonGroup.checkedId()
    arg1,arg2=myFunctions.loadData()

    if signal == -1:
        print("No option selected")
    elif signal == 1: 
        self.ROITotalActivity.clicked.connect(lambda: myFunctions.function1(arg1,arg2))          
    elif signal == 2:
        self.ROITimeVActivity.clicked.connect(lambda: myFunctions.function2(arg1))

" readSignal"函数在"显示"之后调用。按钮已被选中,信号从按钮组获得。有趣的是,即使我收到错误消息,指定的函数(function1和function2)似乎也会运行。我已经读过lambda方法可以用来解决这个问题:

self.ROITimeVActivity.clicked.connect(lambda: self.function2(deltaPix))

但是当我尝试实现它时会出现问题。虽然我这样做时没有收到错误消息,但是连接/信令中的某些东西搞砸了 - 而不是在我单击单选按钮然后单击显示按钮时运行,我想要的功能只在我点击时运行单选按钮 - >显示按钮 - >单选按钮。

ETA:它基本上是这样的:

click

如果没有lambda,选择单选按钮并单击显示后会运行这些函数,但是我收到上面的错误消息。使用lambda,我没有收到错误消息,但我必须再次单击一个单选按钮,显示按钮和单选按钮以运行该功能。

思考?提前谢谢!

1 个答案:

答案 0 :(得分:1)

你说:

  

有趣的是指定的函数(function1和   function2)似乎运行,即使我收到错误消息。

没有什么可比的 - 你在这里调用其中一个函数,然后传递该函数的结果(毫无疑问是None关于connect的错误消息 - 这是总是,在Python中,是

的含义
a(b(c))

对于任何可调用项ba:它表示“使用参数b调用c并将其结果作为a的单个参数传递。< / p>

现在,当您使用时,

a(lambda: b(c))

你要求100%不同的语义 - 传递为a的单个参数一个函数以后称为(w / o arguments),然后“使用参数b”调用c

顺便说一下,

functools.partial(b, c)是一种可以说是更优雅的方法lambda - 但产生完全相同的语义。

至于为什么这不是为你解决的问题 - 我不知道:你展示的代码,用lambda修改,应该是好的 - 如果其他的话在展示的大量代码中,绝对是完美的。所以我怀疑后一种情况不成立。您是否可以制作一个简化的骨干但完整的示例,展示您仍然观察到的错误(应用lambda修复后)...?