python-使用参数连接到函数

我正在使用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))

但是当我尝试实现它时出现了问题.尽管执行此操作时未收到错误消息,但连接/信号中的某些内容却弄乱了-而不是先单击单选按钮然后再单击显示按钮才能运行,而我想要的功能仅在单击单选按钮时才能运行 – &GT显示按钮->单选按钮.

预计到达时间:

click

如果没有lambda,则在选择单选按钮并单击显示后,这些函数将运行,但是出现上述错误消息.使用lambda时,我不会收到错误消息,但是必须再次单击单选按钮,显示按钮和单选按钮才能运行该功能.

思考?先感谢您!

解决方法:

你说:

The interesting thing is that the specified functions (function1 and
function2) appear to run even though I get the error message.

对此没什么奇怪的-您在这里调用了这些函数之一,并传递了该函数的结果(毫无疑问,您收到错误消息的None)进行连接-在Python中,这始终是

a(b(c))

对于任何可调用对象b和a:它的意思是“用参数c调用b并将其结果作为a的单个参数传递.

现在,当您使用时,

a(lambda: b(c))

您需要一个100%不同的语义-将一个函数作为a的单个参数传递,该函数稍后被调用(不带参数)时将“以参数c调用b”.

顺便说一句,functools.partial(b,c)是比lambda更为优雅的方法,但是却产生了完全相同的语义.

至于为什么这不能为您解决所有问题-我不知道:您显示的代码(用lambda修改)应该很好-如果您未显示的大量代码中的所有其他内容都是绝对完美的.因此,我怀疑后一种情况不成立.您能否制作一个简化但完整的示例,以展示仍然观察到的错误(一旦应用了lambda修复程序)…?

上一篇:[AT1999] [agc002_e] Candy Piles


下一篇:leetcode 877. 石子游戏