PyQt的连接方法错误的for循环中使用它从列表中创建控件时

StackOverflow https://stackoverflow.com/questions/736651

  •  09-09-2019
  •  | 
  •  

我有一个GUI程序,

有自动从名称列表创建按钮,  并连接到一个函数打印它的名称。

但是当我运行此程序,我按所有的按钮,

他们都返回最后一个按钮的名称。

我不知道为什么这样的事情发生。任何一个可以帮助?

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)

请参阅为什么地图的结果()和列表理解是不同?,获取的信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top