在for循环中使用PyQt连接方法时创建小部件的错误

1 投票
1 回答
800 浏览
提问于 2025-04-15 11:06

我有一个图形界面程序,

它会根据一个名字列表自动创建按钮,

并且每个按钮都连接到一个函数,这个函数会打印出按钮的名字。

但是当我运行这个程序,按下所有按钮时,

它们都返回了最后一个按钮的名字。

我想知道为什么会这样。有没有人能帮我解决这个问题?

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

1 个回答

3

我在你的代码里发现了至少一个错误。

把下面这段:

 lambda :logging.debug(name)

换成:

 lambda name=name: logging.debug(name)

想了解更多细节,可以查看这个链接:为什么map()和列表推导式的结果不同?

撰写回答