在PyQt5中,如何将带有自己变量的事件函数分配给循环中的QWidget?

2024-10-01 02:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉python和PyQt。为了说明我的问题,我编写了以下代码:

class Window(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        layout = QHBoxLayout(self)

        label1 = QLabel("label1")
        label1.mouseReleaseEvent = lambda event: self.changeText(event, label1)
        layout.addWidget(label1)

        label2 = QLabel("label2")
        label2.mouseReleaseEvent = lambda event: self.changeText(event, label2)
        layout.addWidget(label2)

        for i in range(0,2):
            label = QLabel("label")
            label.mouseReleaseEvent = lambda event: self.changeText(event, label)
            layout.addWidget(label)


    def changeText(self, event, label):
        label.setText("pressed")

所以,我们有4个标签,我想让它可以点击。用作标签1。单击标签,然后更改文本。但是对于那些在循环中创建的标签,赋值是不正确的。传递给函数的标签总是最后一个。无论单击哪个标签,最后一个标签都将更改其文本。这种行为在我看来很神奇。我需要一个建议,如何以这样的方式组织循环,使每个标签传递自己到一个函数?在


Tags: lambdaselfeventinitdef标签labellayout
1条回答
网友
1楼 · 发布于 2024-10-01 02:22:15

之所以会发生这种情况,是因为python会在调用label之前绑定label的值。在

您可以通过这样编写处理程序来解决这个问题。在

label.mouseReleaseEvent = lambda event, label=label: self.changeText(event, label)

参考:

相关问题 更多 >