我正在使用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:它基本上是这样的:
如果没有lambda,选择单选按钮并单击显示后会运行这些函数,但是我收到上面的错误消息。使用lambda,我没有收到错误消息,但我必须再次单击一个单选按钮,显示按钮和单选按钮以运行该功能。
思考?提前谢谢!
答案 0 :(得分:1)
你说:
有趣的是指定的函数(function1和 function2)似乎运行,即使我收到错误消息。
没有什么可比的 - 你在这里调用其中一个函数,然后传递该函数的结果(毫无疑问是None
关于connect
的错误消息 - 这是总是,在Python中,是
a(b(c))
对于任何可调用项b
和a
:它表示“使用参数b
调用c
并将其结果作为a
的单个参数传递。< / p>
现在,当您使用时,
a(lambda: b(c))
你要求100%不同的语义 - 传递为a
的单个参数一个函数,以后称为(w / o arguments),然后“使用参数b
”调用c
。
functools.partial(b, c)
是一种可以说是更优雅的方法lambda
- 但产生完全相同的语义。
至于为什么这不是为你解决的问题 - 我不知道:你展示的代码,用lambda
修改,应该是好的 - 如果其他的话在不展示的大量代码中,绝对是完美的。所以我怀疑后一种情况不成立。您是否可以制作一个简化的骨干但完整的示例,展示您仍然观察到的错误(应用lambda
修复后)...?