[PySide] Passing parameter from one class to an external function

Alberto Soto alberto.soto at lmsintl.com
Sun Apr 8 19:19:30 CEST 2012


Hi Cris,

Welcome to Pyside programming!
I do not know what you intend to do, but based on your example I can think of 2 main options and a 3rd option that is simply a lambda version of the 2nd one.
Here is the example code:

import sys
from PySide import QtCore
from PySide import QtGui


class Form(QtGui.QDialog):
    greetings = QtCore.Signal(str)  
    
    def __init__(self, parent=None):

        QtGui.QDialog.__init__(self, parent=None)        

        self.edit = QtGui.QLineEdit("Write my name here")
        self.button = QtGui.QPushButton("Show Greetings 1")       
        self.special_button = QtGui.QPushButton("Show Greetings 2")        
        self.lambda_button = QtGui.QPushButton("Show Greetings 3")        
        self.layout = QtGui.QVBoxLayout()
        self.layout.addWidget(self.edit)
        self.layout.addWidget(self.button)       
        self.layout.addWidget(self.special_button)       
        self.layout.addWidget(self.lambda_button)       
        self.setLayout(self.layout)
        # option 1
        self.button.clicked.connect(self.greetings)
        # option 2
        def lambdaGReetings ():
            greetings(self)
        self.special_button.clicked.connect(lambdaGReetings)
        # option 3
        self.lambda_button.clicked.connect(lambda: greetings(self))

    def greetings (self):
        greetings(self)
  
def greetings(self):
    print ("Hello %s" % self.edit.text())    
    
 
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    
    form = Form()
    form.show()
    sys.exit(app.exec_())


Option 1 implies that something has to be done before or after calling the greetings option inside your class.
If, you just want to call the greetings and nothing else, you can define a local function as I did in option 2. You can also do this by using the lambda function, though I personally prefer defining functions.
 
self.button.clicked.connect(greetings) 
	=> You are not passing the self argument is passed

self.button.clicked.connect(lambda e: greetings(self))
	  => Lambda is expecting a "e" argument, but the button clicked signal will not give one. For it to send an argument you should explicitlly call the clicked signal version that cointains a bool argument:
	# this modified version will work
	self.lambda_button.clicked[bool].connect(lambda e: greetings(self))

self.button.clicked.connect(lambda e, self=self:greetings(self)) => 
	=> you do not need to define self, because it is already abailable in the scope.

I hope this helps and that I was clear.

Best regards,

ASO

-----Original Message-----
From: pyside-bounces+alberto.soto=lmsintl.com at qt-project.org [mailto:pyside-bounces+alberto.soto=lmsintl.com at qt-project.org] On Behalf Of craf
Sent: jeudi 5 avril 2012 00:14
To: pyside at lists.pyside.org
Subject: [PySide] Passing parameter from one class to an external function

Hi Everyone!.

Recently  start with Pyside and I would like to know how I can call the function greetings from within the Form class, passing the self argument.

My Code:---------------------------------------------------

import sys
from PySide.QtCore import *
from PySide.QtGui import *


class Form(QDialog):
   
    def __init__(self, parent=None):

        QDialog.__init__(self, parent=None)        

        self.edit = QLineEdit("Write my name here")
        self.button = QPushButton("Show Greetings")        
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.edit)
        self.layout.addWidget(self.button)       
        self.setLayout(self.layout)
        self.button.clicked.connect(greetings)
        
  
def greetings(self):
    print ("Hello %s" % self.edit.text())    
    
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = Form()
    form.show()
    sys.exit(app.exec_())

----------------------------------------------------

I try with:

self.button.clicked.connect(greetings)
self.button.clicked.connect(lambda e: greetings(self)) 
self.button.clicked.connect(lambda e, self=self:greetings(self))

but, nothing.

I appreciate any information

Best Regards

Cris

_______________________________________________
PySide mailing list
PySide at qt-project.org
http://lists.qt-project.org/mailman/listinfo/pyside



More information about the PySide mailing list