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?