通过信号的函数调用将默认键控参数更改为 'False'。为什么?
function call through signal changes default keyed arguments to 'False'. Why?
通过信号连接调用函数时,如
mybutton.clicked.connect(myfunction)
调用该函数时其所有参数都设置为 False。即使已设置默认参数。这是预期的行为吗?
下面的代码显示了一个简单的例子。对于我的特殊情况,将所有参数都设置为 False 并不是一个大问题,因为我可以简单地用 if 语句捕获它。然而,我觉得了解为什么以这种方式实施它可能对进一步的项目有所帮助。
这个简单的程序显示了我所期望的行为。
def function(foo=None):
print(foo)
function()
None
然而,对于这个最小的 Qt 示例,函数参数不再是 'None',而是 'False'。
import sys
from PyQt5.QtWidgets import QMainWindow, QGridLayout, QWidget, QPushButton, QApplication
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
centralWidget = QWidget(self)
self.setCentralWidget(centralWidget)
gridLayout = QGridLayout(self)
centralWidget.setLayout(gridLayout)
btn = QPushButton("button",self)
gridLayout.addWidget(btn)
btn.clicked.connect(self.function)
def function(self, foo=None):
print(foo)
if __name__ == "__main__":
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit( app.exec_() )
False
我想问题是:我是否必须忍受我的函数中没有可用的默认值(即,一旦我注意到它们被设置为 False,我是否需要重置它们)或者是否有任何更聪明的处理方式?
clicked是一个重载信号,即它们是2个同名不同签名的信号。
clicked = QtCore.pyqtSignal([], [bool])
# clicked = QtCore.pyqtSignal()
# clicked = QtCore.pyqtSignal(bool)
有关详细信息,请阅读 。
建立连接后,PyQt 确定将使用哪个信号,在这种情况下,您的函数的参数类似于第二种形式,因此信号将发送布尔值 False,在您的情况下,它将替换默认值。
如果你不希望这种情况发生,那么你必须强制 PyQt 使用第一种形式,使用 @QtCore.pyqtSlot()
装饰器,这样它就不会向你发送任何参数,因此你的函数使用默认参数。
import sys
from PyQt5 import QtCore, QtWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
centralWidget = QtWidgets.QWidget()
self.setCentralWidget(centralWidget)
gridLayout = QtWidgets.QGridLayout(centralWidget)
btn = QtWidgets.QPushButton("button")
gridLayout.addWidget(btn)
btn.clicked.connect(self.function)
@QtCore.pyqtSlot()
def function(self, foo=None):
print(foo)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())
输出:
None
另一种可能的解决方案是使用 *
语法强制 keyword-only parameters:
class MainWindow(QtWidgets.QMainWindow):
...
def function(self, *, foo=None):
print(foo)
通过信号连接调用函数时,如
mybutton.clicked.connect(myfunction)
调用该函数时其所有参数都设置为 False。即使已设置默认参数。这是预期的行为吗?
下面的代码显示了一个简单的例子。对于我的特殊情况,将所有参数都设置为 False 并不是一个大问题,因为我可以简单地用 if 语句捕获它。然而,我觉得了解为什么以这种方式实施它可能对进一步的项目有所帮助。
这个简单的程序显示了我所期望的行为。
def function(foo=None):
print(foo)
function()
None
然而,对于这个最小的 Qt 示例,函数参数不再是 'None',而是 'False'。
import sys
from PyQt5.QtWidgets import QMainWindow, QGridLayout, QWidget, QPushButton, QApplication
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
centralWidget = QWidget(self)
self.setCentralWidget(centralWidget)
gridLayout = QGridLayout(self)
centralWidget.setLayout(gridLayout)
btn = QPushButton("button",self)
gridLayout.addWidget(btn)
btn.clicked.connect(self.function)
def function(self, foo=None):
print(foo)
if __name__ == "__main__":
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit( app.exec_() )
False
我想问题是:我是否必须忍受我的函数中没有可用的默认值(即,一旦我注意到它们被设置为 False,我是否需要重置它们)或者是否有任何更聪明的处理方式?
clicked是一个重载信号,即它们是2个同名不同签名的信号。
clicked = QtCore.pyqtSignal([], [bool])
# clicked = QtCore.pyqtSignal()
# clicked = QtCore.pyqtSignal(bool)
有关详细信息,请阅读
建立连接后,PyQt 确定将使用哪个信号,在这种情况下,您的函数的参数类似于第二种形式,因此信号将发送布尔值 False,在您的情况下,它将替换默认值。
如果你不希望这种情况发生,那么你必须强制 PyQt 使用第一种形式,使用 @QtCore.pyqtSlot()
装饰器,这样它就不会向你发送任何参数,因此你的函数使用默认参数。
import sys
from PyQt5 import QtCore, QtWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
centralWidget = QtWidgets.QWidget()
self.setCentralWidget(centralWidget)
gridLayout = QtWidgets.QGridLayout(centralWidget)
btn = QtWidgets.QPushButton("button")
gridLayout.addWidget(btn)
btn.clicked.connect(self.function)
@QtCore.pyqtSlot()
def function(self, foo=None):
print(foo)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())
输出:
None
另一种可能的解决方案是使用 *
语法强制 keyword-only parameters:
class MainWindow(QtWidgets.QMainWindow):
...
def function(self, *, foo=None):
print(foo)