在PyQt4中连接多个按钮信号时,如何避免这种Late Binding的情况?

时间:2016-06-26 22:17:16

标签: python pyqt

我想将多个按钮连接到同一个方法,但每个按钮都有一个与该方法不同的参数。在这种情况下,参数是所有按钮列表中按钮的索引。

from PyQt4 import QtGui, QtCore
import sys
class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        #We declare each button
        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)
        #We combine the buttons in a list
        list_of_buttons = [self.pushButton_01,self.pushButton_02,self.pushButton_03,self.pushButton_04,self.pushButton_05,self.pushButton_06]
        layout = QtGui.QVBoxLayout(self)
        #We add each button to the layout
        for button in list_of_buttons:
            layout.addWidget(button)
        #This is supposed to connect each button in a way that in prints out its index in the list above
        for button in list_of_buttons:
            button.clicked.connect(lambda: self.handle(list_of_buttons.index(button)))


    def handle(self,x):
        print x

if __name__ == '__main__':

    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

1 个答案:

答案 0 :(得分:1)

当发出按钮信号时,您创建的所有lambda都会看到与循环的最后一次迭代之后__init__相同的button is self.pushButton_06命名空间。clicked(checked)。 在您的第二个变体中,您正在连接另一个信号:False;和PyQt忽略lambda参数的默认值并传递给它__init__打印出来。

我使用functools.partial来解决这个问题。 for i, button in enumerate(list_of_buttons): slot = functools.partial(self.handle, i) button.clicked.connect(slot) 中的循环可能如下所示:

RewriteEngine on

#if foo requested, return foo.html contents
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.html -f
RewriteRule ^(.*)$ $1.html [L]

#redirect foo.html to foo
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.+)\.html$ $1 [R,L]