我想将多个按钮连接到同一个方法,但每个按钮都有一个与该方法不同的参数。在这种情况下,参数是所有按钮列表中按钮的索引。
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 。
答案 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]