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建议中那样工作。