Ошибка лямбда отсутствует 1 требуемый позиционный аргумент при использовании с QPushButton

#python #pyside2 #qpushbutton

#python #pyside2 #qpushbutton

Вопрос:

Это весь мой код:

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

Когда я запускаю этот код, я получаю окно, подобное этому:изображение здесь

Под кнопками есть QLabel, и я хочу, чтобы при нажатии на любую кнопку метка кнопки ссылалась на эту QLabel, но я получаю кучу запутанных ошибок в терминале. Что не так с моим кодом, помогите мне, спасибо.

Ответ №1:

Нажатый сигнал перегружен, поэтому он принимает 2 подписи, в которых он может отправлять bool или нет. Подпись по умолчанию зависит от библиотеки, в данном случае кажется, что PySide2 по умолчанию не отправляет параметр «checked», в отличие от PyQt5, который это делает.

Решение состоит в том, чтобы указать подпись:

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