Lambda与QPushButton配合使用时出现错误:缺少1个必需的位置参数

3

这是我整个的代码:

import sys

from PySide2.QtCore import Qt
from PySide2.QtWidgets import (
    QApplication,
    QHBoxLayout,
    QLabel,
    QMainWindow,
    QPushButton,
    QVBoxLayout,
    QWidget,
)

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        v = QVBoxLayout()
        h = QHBoxLayout()

        for a in range(10):
            button = QPushButton(str(a))
            button.clicked.connect(lambda checked, a=a: self.button_clicked(a)) # error here

            h.addWidget(button)

        v.addLayout(h)

        self.label = QLabel("")
        v.addWidget(self.label)
        
        w = QWidget()
        w.setLayout(v)

        self.setCentralWidget(w)

    def button_clicked(self, n):
        self.label.setText(str(n))

app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

当我运行这段代码时,会得到如下窗口:image here。按钮下面有一个QLabel标签,我想要点击任何一个按钮后,该按钮的标签将引用此QLabel标签,但在终端中却出现了一堆令人困惑的错误。我的代码哪里出了问题,请帮帮我,谢谢。
1个回答

4

clicked信号是过载的,因此它可以接受两个签名:其中一个可以发送布尔值,另一个则不需要。默认签名取决于库,例如在这种情况下,PySide2似乎默认不发送“checked”参数,而PyQt5会发送。

解决方案是指定签名:

button.clicked<b>[bool]</b>.connect(lambda checked, a=a: self.button_clicked(a))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接