Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. PyQt Can't pass correct parameters by button.clicked
Forum Updated to NodeBB v4.3 + New Features

PyQt Can't pass correct parameters by button.clicked

Scheduled Pinned Locked Moved Solved General and Desktop
5 Posts 3 Posters 1.7k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • H Offline
    H Offline
    howxy
    wrote on last edited by
    #1
        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
    屏幕截图 2022-10-22 092745.jpg

        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
    屏幕截图 2022-10-22 092847.jpg

    JonBJ 1 Reply Last reply
    0
    • C Offline
      C Offline
      ChrisW67
      wrote on last edited by
      #2

      I can only assume that the for loop is in the class constructor for the class containing Kvaluechanged. 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.

      1 Reply Last reply
      0
      • H Offline
        H Offline
        howxy
        wrote on last edited by
        #3

        the complete program:
        ui.py

        from 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
        1.jpg
        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
        2.jpg
        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

        1 Reply Last reply
        0
        • H howxy
              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
          屏幕截图 2022-10-22 092745.jpg

              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
          屏幕截图 2022-10-22 092847.jpg

          JonBJ Offline
          JonBJ Offline
          JonB
          wrote on last edited by JonB
          #4

          @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 --- the checked state. From Python you need

          btn.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 the v=n argument was actually accepting the checked argument, hence showing as False.

          I have not looked at your "complete program" post.

          H 1 Reply Last reply
          2
          • JonBJ JonB

            @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 --- the checked state. From Python you need

            btn.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 the v=n argument was actually accepting the checked argument, hence showing as False.

            I have not looked at your "complete program" post.

            H Offline
            H Offline
            howxy
            wrote on last edited by
            #5

            @JonB Thank you ! I get it.

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved