连接到带参数的函数
Connecting to a function with arguments
我正在使用 PyQt 开发用户界面,并最终想出了如何使多个显示选项成为可能(用户单击单选按钮,信号被保存,并且根据该信号不同的功能 运行s 当用户点击 "display")。但是,我 运行 正在查看此错误消息:
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"函数在"Display"按钮被选中后调用,信号是从一个按钮组中获取的。有趣的是,指定的函数(function1 和 function2)出现在 运行 中,即使我收到了错误消息。我读到 lambda 方法可以用来解决这个问题:
self.ROITimeVActivity.clicked.connect(lambda: self.function2(deltaPix))
但是当我尝试实现它时出了点问题。虽然我在执行此操作时没有收到错误消息,但 connection/signaling 中的某些内容变得混乱 - 而不是 运行ning 当我单击单选按钮然后单击显示按钮时,我想要的功能单击单选按钮--> 显示按钮--> 单选按钮仅 运行 秒。
ETA:它基本上是这样的:
在没有 lambda 的情况下,函数 运行 在选择单选按钮并单击显示后出现,但我收到上述错误消息。使用 lambda,我没有收到错误消息,但我必须再次单击单选按钮、显示按钮和单选按钮才能使函数达到 运行。
想法?提前致谢!
你说:
The interesting thing is that the specified functions (function1 and
function2) appear to run even though I get the error message.
这不足为奇——您正在此处调用其中一个函数,并传递该函数的结果(毫无疑问None
你收到关于 connect
的错误信息——在 Python 中 总是 ,
的意思
a(b(c))
对于任何可调用项 b
和 a
:这意味着“使用参数 c
调用 b
并将其结果作为 a
的单个参数传递.
现在当你使用时,
a(lambda: b(c))
你要求的是 100% 不同的语义——作为 a
的单个参数传递 一个函数,稍后称为(w/o 个参数),然后将"call b
with argument c
".
顺便说一句,functools.partial(b, c)
可以说是一种比 lambda
更优雅的方法——但产生的语义完全相同。
至于为什么这不能为您解决所有问题——我不知道:您显示的代码用 lambda
修改后,应该 没问题-- 如果您没有显示的大量代码中的其他所有内容都绝对完美。所以我怀疑后一种情况不成立。你能做一个简化到骨子里但完整的例子来展示你仍然观察到的错误(应用 lambda
修复后)...?
我正在使用 PyQt 开发用户界面,并最终想出了如何使多个显示选项成为可能(用户单击单选按钮,信号被保存,并且根据该信号不同的功能 运行s 当用户点击 "display")。但是,我 运行 正在查看此错误消息:
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"函数在"Display"按钮被选中后调用,信号是从一个按钮组中获取的。有趣的是,指定的函数(function1 和 function2)出现在 运行 中,即使我收到了错误消息。我读到 lambda 方法可以用来解决这个问题:
self.ROITimeVActivity.clicked.connect(lambda: self.function2(deltaPix))
但是当我尝试实现它时出了点问题。虽然我在执行此操作时没有收到错误消息,但 connection/signaling 中的某些内容变得混乱 - 而不是 运行ning 当我单击单选按钮然后单击显示按钮时,我想要的功能单击单选按钮--> 显示按钮--> 单选按钮仅 运行 秒。
ETA:它基本上是这样的:
在没有 lambda 的情况下,函数 运行 在选择单选按钮并单击显示后出现,但我收到上述错误消息。使用 lambda,我没有收到错误消息,但我必须再次单击单选按钮、显示按钮和单选按钮才能使函数达到 运行。
想法?提前致谢!
你说:
The interesting thing is that the specified functions (function1 and function2) appear to run even though I get the error message.
这不足为奇——您正在此处调用其中一个函数,并传递该函数的结果(毫无疑问None
你收到关于 connect
的错误信息——在 Python 中 总是 ,
a(b(c))
对于任何可调用项 b
和 a
:这意味着“使用参数 c
调用 b
并将其结果作为 a
的单个参数传递.
现在当你使用时,
a(lambda: b(c))
你要求的是 100% 不同的语义——作为 a
的单个参数传递 一个函数,稍后称为(w/o 个参数),然后将"call b
with argument c
".
functools.partial(b, c)
可以说是一种比 lambda
更优雅的方法——但产生的语义完全相同。
至于为什么这不能为您解决所有问题——我不知道:您显示的代码用 lambda
修改后,应该 没问题-- 如果您没有显示的大量代码中的其他所有内容都绝对完美。所以我怀疑后一种情况不成立。你能做一个简化到骨子里但完整的例子来展示你仍然观察到的错误(应用 lambda
修复后)...?