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

发布于 2024-07-16 15:58:28 字数 830 浏览 3 评论 0原文

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

I have a GUI program,

It auto create buttons from a name list,
and connect to a function prints its name.

but when I run this program, I press all the buttons,

they all return the last button's name.

I wonder why this thing happens. can any one help?

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_() 

result like:

python t.py
DEBUG:root:c
DEBUG:root:c
DEBUG:root:c

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

薯片软お妹 2024-07-23 15:58:28

我在您的代码中至少看到一个错误。

替换:

 lambda :logging.debug(name)

通过:

 lambda name=name: logging.debug(name)

请参阅 为什么 map() 和列表理解的结果有何不同?了解详情。

I see at least one bug in your code.

Replace:

 lambda :logging.debug(name)

By:

 lambda name=name: logging.debug(name)

See Why results of map() and list comprehension are different? for details.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文