PyQt Can't pass correct parameters by button.clicked
-
for n in range(0, 6): getattr(self, 'Button_input%s' % n).pressed.connect(lambda v=n: self.KvalueChanged(v)) def KvalueChanged(self,v): print(v)
using pressed can return correct int v
for n in range(0, 6): getattr(self, 'Button_input%s' % n).clicked.connect(lambda v=n: self.KvalueChanged(v)) def KvalueChanged(self,v): print(v)
using clicked return bool v
-
I can only assume that the
for
loop is in the class constructor for the class containingKvaluechanged
. This code on its own will not generate output. How you are triggering the buttons is not evident. If you post a complete program demonstrating the problem then it is more likely that someone will respond.BTW: it seems that you are trying to implement something that QSignalMapper already exists for.
-
the complete program:
ui.pyfrom PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtWidgets import * class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") MainWindow.resize(800, 600) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(u"centralwidget") self.layoutWidget_5 = QWidget(self.centralwidget) self.layoutWidget_5.setObjectName(u"layoutWidget_5") self.layoutWidget_5.setGeometry(QRect(330, 140, 258, 71)) self.verticalLayout_5 = QVBoxLayout(self.layoutWidget_5) self.verticalLayout_5.setObjectName(u"verticalLayout_5") self.verticalLayout_5.setContentsMargins(0, 0, 0, 0) self.lineEdit_k3 = QLineEdit(self.layoutWidget_5) self.lineEdit_k3.setObjectName(u"lineEdit_k3") self.verticalLayout_5.addWidget(self.lineEdit_k3) self.Button_input3 = QPushButton(self.layoutWidget_5) self.Button_input3.setObjectName(u"Button_input3") self.verticalLayout_5.addWidget(self.Button_input3) self.layoutWidget_3 = QWidget(self.centralwidget) self.layoutWidget_3.setObjectName(u"layoutWidget_3") self.layoutWidget_3.setGeometry(QRect(40, 250, 258, 71)) self.verticalLayout_3 = QVBoxLayout(self.layoutWidget_3) self.verticalLayout_3.setObjectName(u"verticalLayout_3") self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) self.lineEdit_k4 = QLineEdit(self.layoutWidget_3) self.lineEdit_k4.setObjectName(u"lineEdit_k4") self.verticalLayout_3.addWidget(self.lineEdit_k4) self.Button_input4 = QPushButton(self.layoutWidget_3) self.Button_input4.setObjectName(u"Button_input4") self.verticalLayout_3.addWidget(self.Button_input4) self.layoutWidget_4 = QWidget(self.centralwidget) self.layoutWidget_4.setObjectName(u"layoutWidget_4") self.layoutWidget_4.setGeometry(QRect(330, 250, 258, 71)) self.verticalLayout_4 = QVBoxLayout(self.layoutWidget_4) self.verticalLayout_4.setObjectName(u"verticalLayout_4") self.verticalLayout_4.setContentsMargins(0, 0, 0, 0) self.lineEdit_k5 = QLineEdit(self.layoutWidget_4) self.lineEdit_k5.setObjectName(u"lineEdit_k5") self.verticalLayout_4.addWidget(self.lineEdit_k5) self.Button_input5 = QPushButton(self.layoutWidget_4) self.Button_input5.setObjectName(u"Button_input5") self.verticalLayout_4.addWidget(self.Button_input5) self.layoutWidget = QWidget(self.centralwidget) self.layoutWidget.setObjectName(u"layoutWidget") self.layoutWidget.setGeometry(QRect(330, 30, 258, 71)) self.verticalLayout = QVBoxLayout(self.layoutWidget) self.verticalLayout.setObjectName(u"verticalLayout") self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.lineEdit_k1 = QLineEdit(self.layoutWidget) self.lineEdit_k1.setObjectName(u"lineEdit_k1") self.verticalLayout.addWidget(self.lineEdit_k1) self.Button_input1 = QPushButton(self.layoutWidget) self.Button_input1.setObjectName(u"Button_input1") self.verticalLayout.addWidget(self.Button_input1) self.layoutWidget_2 = QWidget(self.centralwidget) self.layoutWidget_2.setObjectName(u"layoutWidget_2") self.layoutWidget_2.setGeometry(QRect(40, 140, 258, 71)) self.verticalLayout_2 = QVBoxLayout(self.layoutWidget_2) self.verticalLayout_2.setObjectName(u"verticalLayout_2") self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.lineEdit_k2 = QLineEdit(self.layoutWidget_2) self.lineEdit_k2.setObjectName(u"lineEdit_k2") self.verticalLayout_2.addWidget(self.lineEdit_k2) self.Button_input2 = QPushButton(self.layoutWidget_2) self.Button_input2.setObjectName(u"Button_input2") self.verticalLayout_2.addWidget(self.Button_input2) self.layoutWidget_6 = QWidget(self.centralwidget) self.layoutWidget_6.setObjectName(u"layoutWidget_6") self.layoutWidget_6.setGeometry(QRect(30, 30, 258, 71)) self.verticalLayout_6 = QVBoxLayout(self.layoutWidget_6) self.verticalLayout_6.setObjectName(u"verticalLayout_6") self.verticalLayout_6.setContentsMargins(0, 0, 0, 0) self.lineEdit_k0 = QLineEdit(self.layoutWidget_6) self.lineEdit_k0.setObjectName(u"lineEdit_k0") self.verticalLayout_6.addWidget(self.lineEdit_k0) self.Button_input0 = QPushButton(self.layoutWidget_6) self.Button_input0.setObjectName(u"Button_input0") self.verticalLayout_6.addWidget(self.Button_input0) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setObjectName(u"menubar") self.menubar.setGeometry(QRect(0, 0, 800, 23)) MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName(u"statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) # setupUi def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None)) self.Button_input3.setText(QCoreApplication.translate("MainWindow", u"Button_input3", None)) self.Button_input4.setText(QCoreApplication.translate("MainWindow", u"Button_input4", None)) self.Button_input5.setText(QCoreApplication.translate("MainWindow", u"Button_input5", None)) self.Button_input1.setText(QCoreApplication.translate("MainWindow", u"Button_input1", None)) self.Button_input2.setText(QCoreApplication.translate("MainWindow", u"Button_input2", None)) self.Button_input0.setText(QCoreApplication.translate("MainWindow", u"Button_input0", None)) # retranslateUi
main.py(import is not included)
class myMainWindow(Ui_MainWindow, QMainWindow): def __init__(self): super(Ui_MainWindow, self).__init__() self.setupUi(self) for n in range(0, 6): getattr(self, 'Button_input%s' % n).pressed.connect(lambda v=n: self.KvalueChanged(v)) def KvalueChanged(self,v): print(v) getattr(self, 'lineEdit_k%s' % v).setText(str(v)) if __name__ == '__main__': app = QApplication(sys.argv) vieo_gui = myMainWindow() vieo_gui.show() sys.exit(app.exec_())
the correct result is
while 'pressed' changed 'clicked'class myMainWindow(Ui_MainWindow, QMainWindow): def __init__(self): super(Ui_MainWindow, self).__init__() self.setupUi(self) for n in range(0, 6): getattr(self, 'Button_input%s' % n).clicked.connect(lambda v=n: self.KvalueChanged(v)) def KvalueChanged(self,v): print(v) getattr(self, 'lineEdit_k%s' % v).setText(str(v)) if __name__ == '__main__': app = QApplication(sys.argv) vieo_gui = myMainWindow() vieo_gui.show() sys.exit(app.exec_())
the result is wrong when button is clicked
error message :
Traceback (most recent call last):
File "D:\python_project\hohww\object-fall-detect\PythonApplication3\module3.py", line 29, in <lambda>
getattr(self, 'Button_input%s' % n).clicked.connect(lambda v=n: self.KvalueChanged(v))
File "D:\python_project\hohww\object-fall-detect\PythonApplication3\module3.py", line 34, in KvalueChanged
getattr(self, 'lineEdit_k%s' % v).setText(str(v))
AttributeError: 'myMainWindow' object has no attribute 'lineEdit_kFalse'why the v is changed from int to False
-
for n in range(0, 6): getattr(self, 'Button_input%s' % n).pressed.connect(lambda v=n: self.KvalueChanged(v)) def KvalueChanged(self,v): print(v)
using pressed can return correct int v
for n in range(0, 6): getattr(self, 'Button_input%s' % n).clicked.connect(lambda v=n: self.KvalueChanged(v)) def KvalueChanged(self,v): print(v)
using clicked return bool v
@howxy said in PyQt Can't pass correct parameters by button.clicked:
getattr(self, 'Button_input%s' % n).pressed.connect(lambda v=n: self.KvalueChanged(v))
This works because
QPushButton.pressed()
signal does not take any parameter.getattr(self, 'Button_input%s' % n).clicked.connect(lambda v=n: self.KvalueChanged(v))
This does not work because
QPushButton.clicked(bool checked = False)
signal does take a parameter --- thechecked
state. From Python you needbtn.clicked.connect(lambda checked, v=n: self.KvalueChanged(v))
Something like that --- the lambda must be shown to accept the
checked
argument, any arguments you add must come after proper specification of the arguments actually passed by the signal. Your way thev=n
argument was actually accepting thechecked
argument, hence showing asFalse
.I have not looked at your "complete program" post.
-
@howxy said in PyQt Can't pass correct parameters by button.clicked:
getattr(self, 'Button_input%s' % n).pressed.connect(lambda v=n: self.KvalueChanged(v))
This works because
QPushButton.pressed()
signal does not take any parameter.getattr(self, 'Button_input%s' % n).clicked.connect(lambda v=n: self.KvalueChanged(v))
This does not work because
QPushButton.clicked(bool checked = False)
signal does take a parameter --- thechecked
state. From Python you needbtn.clicked.connect(lambda checked, v=n: self.KvalueChanged(v))
Something like that --- the lambda must be shown to accept the
checked
argument, any arguments you add must come after proper specification of the arguments actually passed by the signal. Your way thev=n
argument was actually accepting thechecked
argument, hence showing asFalse
.I have not looked at your "complete program" post.