我有一个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)


有关详细信息,请参见Why results of map() and list comprehension are different?

关于python - 在for循环中使用PyQt connect方法错误时,该循环从列表中创建窗口小部件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/736651/

10-12 21:37