How to pass arguments to functions by the click of button in PyQt?

后端 未结 6 1488
时光说笑
时光说笑 2020-12-07 20:45

I want to pass the arguments to a function when I click the button. What should I add to this line button.connect(button, QtCore.SIGNAL(\'clicked()\'), calluser(name))

相关标签:
6条回答
  • 2020-12-07 21:26

    Here is another way. --- PARTIAL -- I find this one most simple:

        widget = QWidget()
        widgetLayout = QVBoxLayout()
    
        for action in list:
    
            button = QPushButton("{action}".format(action=action['name']),self)
            button.clicked.connect(partial(self.action_selected,action=action['name']))
            widgetLayout.addWidget(button)
    
        widget.setLayout(widgetLayout)
    
    def action_selected(self,action):
        print action
    

    found on: http://tech-artists.org/forum/showthread.php?3118-PyQt-Maya-How-to-pass-arguments-to-a-function-when-connecting-it-to-PyQt-button

    0 讨论(0)
  • 2020-12-07 21:29

    The code shown below illustrates a method of associating data with generated buttons. For example, you could change the statement self.keydata[b] = key to store a tuple of data into self.keydata[b] for use when processing a button event later.

    Note, in the following code, assets is a previously-defined dictionary containing titles for buttons. In the processButton(self) routine, self.sender() is equal to an entry in the class variable buttons[].

    class Tab5(QtGui.QWidget):
        buttons, keydata = {}, {}
        def __init__(self, fileInfo, parent=None):
            super(Tab5, self).__init__(parent)
            layout = QtGui.QVBoxLayout()
    
            for key in sorted(assets):
                b = self.buttons[key] = QtGui.QPushButton(assets[key], self)
                b.clicked.connect(self.processButton)
                layout.addWidget(b)
                print 'b[key]=',b, ' b-text=',assets[key]
                self.keydata[b] = key
    
            layout.addStretch(1)
            self.setLayout(layout)
    
        def processButton(self):
             print 'sender=',self.sender(), ' s-text=',self.sender().text(), ' data[.]=', self.keydata[self.sender()] 
             pass
    

    Output was like the following, where the first four lines printed during the for loop, and the last four printed when the four buttons were pressed in order.

    b[key]= <PySide.QtGui.QPushButton object at 0x7f382f2ca830>  b-text= K1
    b[key]= <PySide.QtGui.QPushButton object at 0x7f382f2ca908>  b-text= K2
    b[key]= <PySide.QtGui.QPushButton object at 0x7f382f2ca950>  b-text= K3
    b[key]= <PySide.QtGui.QPushButton object at 0x7f382f2ca998>  b-text= K4
    sender= <PySide.QtGui.QPushButton object at 0x7f382f2ca830>  s-text= K1  data[.]= L1
    sender= <PySide.QtGui.QPushButton object at 0x7f382f2ca908>  s-text= K2  data[.]= L2
    sender= <PySide.QtGui.QPushButton object at 0x7f382f2ca950>  s-text= K3  data[.]= L3
    sender= <PySide.QtGui.QPushButton object at 0x7f382f2ca998>  s-text= K4  data[.]= L4
    
    0 讨论(0)
  • 2020-12-07 21:39

    Usually GUIs are built using classes. By using bound methods as callbacks (see self.calluser below) you can "pass" information to the callback through self's attributes (e.g. self.name):

    For example, using slightly modified code from this tutorial:

    import sys
    import PyQt4.QtCore as QtCore
    import PyQt4.QtGui as QtGui
    
    class QButton(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
            self.button = QtGui.QPushButton('Button', self)
            self.name='me'
            self.button.clicked.connect(self.calluser)
        def calluser(self):
            print(self.name)
    
    def demo_QButton():
        app = QtGui.QApplication(sys.argv)
        tb = QButton()
        tb.show()
        app.exec_()
    
    if __name__=='__main__':
        demo_QButton()
    

    Since the callback per se is always called with no additional arguments, when you need to pass distinct additional information to many callbacks, you need to make different callbacks for each button.

    Since that can be laborious (if done manually), use a function factory instead. See below for an example. The function factory is a closure. It can be passed additional arguments, which the inner function can access when called:

    class ButtonBlock(QtGui.QWidget):
    
        def __init__(self, *args):
            super(QtGui.QWidget, self).__init__()
            grid = QtGui.QGridLayout()
            names = ('One', 'Two', 'Three', 'Four', 'Five',
                     'Six', 'Seven', 'Eight', 'Nine', 'Ten')
            for i, name in enumerate(names):
                button = QtGui.QPushButton(name, self)
                button.clicked.connect(self.make_calluser(name))
                row, col = divmod(i, 5)
                grid.addWidget(button, row, col)
            self.setLayout(grid)
    
        def make_calluser(self, name):
            def calluser():
                print(name)
            return calluser
    
    app = QtGui.QApplication(sys.argv)
    tb = ButtonBlock()
    tb.show()
    app.exec_()
    
    0 讨论(0)
  • 2020-12-07 21:41

    You can simply write

    name = "user"
    button.clicked.connect(lambda: calluser(name))
    
    0 讨论(0)
  • 2020-12-07 21:45

    I tried an efficient way of doing it and it worked out well for me. You can use the code:

    from functools import partial
    
    def calluser(name):
        print name
    
    def Qbutton():
        button = QtGui.QPushButton("button",widget)
        name = "user"
        button.setGeometry(100,100, 60, 35)
        button.clicked.connect(partial(calluser,name))
    
    0 讨论(0)
  • 2020-12-07 21:47

    In Python, class instances are callable. You can just use an instance of a class as a function. That class can contain whatever you want. (In some languages or frameworks, a callable object is called a functor or a function object.)

    class CallUser:
        def __init__(self, name):
            self.name = name
        def __call__(self):
            print(self.name)
    
    def Qbutton():
        button = QtGui.QPushButton("button",widget)
        name = "user"
        button.setGeometry(100,100, 60, 35)
        button.clicked.connect(CallUser(name))
        # Object of type CallUser will work as a function!
    
    0 讨论(0)
提交回复
热议问题