Python 连接到具有参数的函数
我正在使用PyQt开发一个用户界面,并最终找到了如何实现多个显示选项(用户单击单选按钮,会保存一个信号,根据该信号,当用户点击“显示”时,会运行不同的功能)。但是,我遇到了以下错误消息:Python 连接到具有参数的函数,python,qt,user-interface,pyqt,Python,Qt,User Interface,Pyqt,我正在使用PyQt开发一个用户界面,并最终找到了如何实现多个显示选项(用户单击单选按钮,会保存一个信号,根据该信号,当用户点击“显示”时,会运行不同的功能)。但是,我遇到了以下错误消息: TypeError: connect() slot argument should be a callable or a signal, not 'NoneType' 我认为这与我将带参数的函数传递到“connect”方法有关。简而言之,下面是我正在查看的代码块: from PyQt4 import QtCo
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))
选择“显示”按钮后,调用“读取信号”功能,并从按钮组获取信号。有趣的是,即使我收到了错误消息,指定的函数(function1和function2)似乎仍在运行。我已经读到lambda方法可以用来解决这个问题:
self.ROITimeVActivity.clicked.connect(lambda: self.function2(deltaPix))
但是,当我尝试实施它时,出现了一些问题。虽然执行此操作时未收到错误消息,但连接/信号中的某些内容会出错—我没有在单击单选按钮然后单击显示按钮时运行,而是在单击单选按钮-->显示按钮-->单选按钮时才运行我想要的功能
埃塔:基本上是这样的:
在没有lambda的情况下,函数在选择单选按钮并单击display后运行,但我收到了上面的错误消息。对于lambda,我不会收到错误消息,但我必须再次单击单选按钮、显示按钮和单选按钮才能运行该函数
想法?提前谢谢你 你说:
有趣的是,指定的函数(function1和
即使收到错误消息,功能2)仍会运行
这一点也不奇怪,在这里调用其中一个函数,并将该函数的结果(毫无疑问,无
错误消息)传递给连接
——在Python中,这始终是
a(b(c))
对于任何可调用的b
和a
:它表示“使用参数c
调用b
,并将其结果作为a
的单个参数传递”
现在当你使用
a(lambda: b(c))
你要求的是一种100%不同的语义——作为a
的单个参数传递一个函数,该函数在以后调用(不带参数)时将“调用b
带参数c
”
顺便说一句,partial(b,c)可以说是一种比lambda
更优雅的方法,但是产生了完全相同的语义
至于为什么这不能为你解决所有问题——我不知道:你显示的代码,用
lambda
修改,应该可以好——如果你没有显示的大量代码中的所有其他内容都是绝对完美的。所以我怀疑后一种情况不适用。你能做一个简化到骨头但展示您仍然观察到的bug的完整示例(一旦应用了lambda
fix)…?如果您提供了一个简短、自包含、正确的示例,这将非常有帮助。我们不能将您的代码放在上面并实际运行任何东西来查看您遇到的问题,因此在这一点上,大多数是有根据的猜测。在lambda中捕获deltaPix
变量是否解决了您的问题?例如Self.roitimevativity.clicked.connect(lambda dp=deltaPix:self.function2(dp))
什么是ROITotalActivity
和ROITimeVActivity
,为什么每次单击显示按钮时都要尝试将新的信号处理程序连接到它们?您希望这些处理程序在单击显示按钮本身时运行,还是仅在单击其他按钮时运行?