Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在PyQt4中连接多个按钮信号时,如何避免这种延迟绑定的情况?_Python_Pyqt - Fatal编程技术网

Python 在PyQt4中连接多个按钮信号时,如何避免这种延迟绑定的情况?

Python 在PyQt4中连接多个按钮信号时,如何避免这种延迟绑定的情况?,python,pyqt,Python,Pyqt,我想将多个按钮连接到同一个方法,但每个按钮都有不同的参数。在本例中,参数是所有按钮列表中按钮的索引 从PyQt4导入QtGui,QtCore 导入系统 类窗口(QtGui.QWidget): 定义初始化(自): QtGui.QWidget.\uuuuu init\uuuuuuu(self) #我们宣布每个按钮 self.pushButton_01=QtGui.QPushButton(self) self.pushButton_02=QtGui.QPushButton(self) self.pus

我想将多个按钮连接到同一个方法,但每个按钮都有不同的参数。在本例中,参数是所有按钮列表中按钮的索引

从PyQt4导入QtGui,QtCore
导入系统
类窗口(QtGui.QWidget):
定义初始化(自):
QtGui.QWidget.\uuuuu init\uuuuuuu(self)
#我们宣布每个按钮
self.pushButton_01=QtGui.QPushButton(self)
self.pushButton_02=QtGui.QPushButton(self)
self.pushButton_03=QtGui.QPushButton(self)
self.pushButton_04=QtGui.QPushButton(self)
self.pushButton_05=QtGui.QPushButton(self)
self.pushButton_06=QtGui.QPushButton(self)
#我们将这些按钮组合成一个列表
按钮列表=[self.button_01、self.button_02、self.button_03、self.button_04、self.button_05、self.button_06]
layout=QtGui.QVBoxLayout(self)
#我们将每个按钮添加到布局中
对于按钮列表中的按钮(共个按钮):
layout.addWidget(按钮)
#这应该是连接每个按钮的方式,在打印出其在上面列表中的索引
对于按钮列表中的按钮(共个按钮):
按钮。点击。连接(lambda:self.handle(按钮列表。索引(按钮)))
def手柄(自身,x):
打印x
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=QtGui.QApplication(sys.argv)
window=window()
window.show()
sys.exit(app.exec_())
当我单击每个按钮时,我希望输出是一个从0到5的整数,但是每个按钮输出最后一个索引5

编辑

我尝试了以下方法

button.clicked.connect(lambda button = button: self.handle(list_of_buttons.index(button)))
但每当我点击一个按钮,我就会

ValueError: False is not in list
所以我试着把第二个循环改成

for i in range(0,6):
        list_of_buttons[i].clicked.connect(lambda i=i: self.handle(i))

但是,即使前面的错误不再出现,只要我单击一个按钮,它就会输出False。

当按钮信号发出时,您创建的所有lambda都会看到相同的
\uuuu init\uuuu
名称空间,与上次循环迭代后相同,其中
按钮是self.button\u 06

在第二个变体中,您正在连接到另一个信号:
单击(选中)
;PyQt忽略lambda参数的默认值,并将其传递给打印出来的
False

我会用计算机解决这个问题。
\uuuu init\uuuu
中的循环可能如下所示:

for i, button in enumerate(list_of_buttons):
    slot = functools.partial(self.handle, i)
    button.clicked.connect(slot)

尝试
lambda button=button:self.handle(按钮列表.索引(button))
@juanpa.arrivillaga我用结果编辑了我的帖子。非常感谢您解释这两种情况下出现的错误!非常有价值,因为我还在学习@NoahBishop澄清:除非PyQt不是那么聪明,也不是根据插槽签名拾取信号,否则闭包将像juanpa.arrivillaga建议中那样工作。