PyQt的连接方法错误在for循环中,从列表中
问题描述:
我有一个GUI程序创建小部件时,PyQt的连接方法错误在for循环中,从列表中
它自动从名称列表创建按钮, 并连接到一个函数打印它的名字。
但是当我运行这个程序,我按下所有的按钮,
他们都返回最后一个按钮的名称。
我想知道为什么会发生这种情况。任何人都可以帮忙吗?
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import logging
logging.basicConfig(level=logging.DEBUG,)
class MainWindow(QWidget):
def init(self):
names = ('a','b','c')
lo = QHBoxLayout(self)
for name in names:
button = QPushButton(name,self)
lo.addWidget(button)
self.connect(button,SIGNAL("clicked()"),
lambda :logging.debug(name))
if __name__=="__main__":
app = QApplication(sys.argv)
m = MainWindow();m.init();m.show()
app.exec_()
结果一样:
python t.py
DEBUG:root:c
DEBUG:root:c
DEBUG:root:c
答
我看到你的代码中的至少一个错误。
替换:
lambda :logging.debug(name)
通过:
lambda name=name: logging.debug(name)
详见Why results of map() and list comprehension are different?。