web-dev-qa-db-fra.com

appeler une fonction quand un bouton est enfoncé - pyqt

Je suis nouveau dans ce domaine ... J'appellerais la fonction "funcion" quand je clique sur "btn_brow_3". Comment pourrais-je faire cela? Quelqu'un peut m'aider?

Error TYPE ERROR L'argument de l'emplacement de connexion () doit être un appelable ou un signal non "non-type"

Cordialement Maxi

import atexit
import sys
from PyQt4 import QtGui
import os                           # Libreria para manejar directorios del sistema operativo

def funcion(a):
    print "Hola mundo" + str(a)

class Example(QtGui.QMainWindow):

    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):               

        exitAction = QtGui.QAction(QtGui.QIcon('c:/prueba gui/resource/logo.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(QtGui.qApp.quit)

        btn_brow_1 = QtGui.QPushButton('Browser...', self)
        btn_brow_1.resize(btn_brow_1.sizeHint())
        btn_brow_1.move(300, 50)
        btn_brow_1.clicked.connect(self.showDialog_points)

        btn_brow_2 = QtGui.QPushButton('Dir browser', self)
        btn_brow_2.resize(btn_brow_2.sizeHint())
        btn_brow_2.move(300, 80)
        btn_brow_2.clicked.connect(self.showDialog_indir_stl)

        btn_brow_3 = QtGui.QPushButton('Dir browser', self)
        btn_brow_3.resize(btn_brow_3.sizeHint())
        btn_brow_3.move(300, 110)
        btn_brow_3.clicked.connect(self.showDialog_outdir_stl)




        btn_brow_4 = QtGui.QPushButton('Crear soportes', self)
        btn_brow_4.setGeometry(20, 145, 250, 25)
        #btn_brow_4.clicked.connect(support.main(fname_points, self.fname_stl_indir, self.fname_stl_outdir))
        btn_brow_4.clicked.connect(funcion(12))  # HERE IS THE PROBLEM!

        self.le1 = QtGui.QLineEdit(self)
        self.le1.setGeometry(20, 50, 250,21)

        self.le2 = QtGui.QLineEdit(self)
        self.le2.setGeometry(20, 80, 250,21)

        self.le3 = QtGui.QLineEdit(self)
        self.le3.setGeometry(20, 110, 250,21)

        self.statusBar().showMessage("Ready")

        self.toolbar = self.addToolBar('Exit')
        self.toolbar.addAction(exitAction)

        self.setGeometry(300, 300, 400, 200)
        self.setWindowTitle('Support from points generator')    
        self.show()



    def showDialog_points(self):

        self.fname_points = QtGui.QFileDialog.getOpenFileName(self, 'Open points file', '/home')
        self.statusBar().showMessage(str(self.fname_points))
        self.le1.setText(str(self.fname_points))
        self.fname_points = str(self.le1.text())
        print fname_points


    def showDialog_indir_stl(self):

        self.fname_stl_indir = QtGui.QFileDialog.getExistingDirectory(self, 'Select STL INPUT directory', '/home')
        self.statusBar().showMessage(str(self.fname_stl_indir))
        self.le2.setText(str(self.fname_stl_indir))
        self.fname_stl_indir = str(self.le2.text())
        print fname_stl_indir 

    def showDialog_outdir_stl(self):

        self.fname_stl_outdir = QtGui.QFileDialog.getExistingDirectory(self, 'Select STL OUTPUT directory', '/home')
        self.statusBar().showMessage(str(self.fname_stl_outdir))
        self.le3.setText(str(self.fname_stl_outdir))
        self.fname_stl_outdir = str(self.le3.text())
        print fname_stl_outdir 

def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()


    sys.exit(app.exec_())

if __== '__main__':
    main()
12
user2109621

Les signaux Qt peuvent avoir des arguments qui seront transmis aux slots auxquels ils sont connectés; un exemple serait la nouvelle valeur en tant qu'argument dans un signal changed. Par conséquent, bien que vous pouvez avez un emplacement avec des arguments, vous ne pouvez pas définir les valeurs réelles de ceux-ci lors de la connexion du signal à l’emplacement, car ils seront définis lors de l’émission du signal.

Pour définir un argument au moment de la connexion, vous pouvez utiliser une fonction supplémentaire qui ne fait qu'appeler la fonction d'origine avec l'argument défini:

def wrapper():
    funcion(12)

def funcion(a):
    print "Hola mundo" + str(a)

[...]
btn_brow_4.clicked.connect(wrapper)

Remarque: wrapper n'utilise pas d'accolades ici: la fonction n'est pas appelée, elle est simplement passée en argument à la fonction connect. Dans votre code, vous appelé votre fonction funcion, qui ne renvoie rien (= None), qui a été transmise à connect dans votre code d'origine, ce qui entraîne le message d'erreur que vous avez reçu.

Pour rendre cela un peu plus propre, vous pouvez également utiliser une fonction anonyme:

btn_brow_4.clicked.connect(lambda: funcion(12))

Notez que Qt fournit également des moyens de le faire, mais (du moins pour moi), les variantes de Python sont plus faciles à lire.

Edit: Quelques informations supplémentaires: http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/

13
rainer

Vous pouvez utiliser la méthode ci-dessous pour accéder au même:

self.connect(btn_brow_4,Qt.SIGNAL("clicked()"),self.callingFunction)

def callingFunction():
    function(12)
3
Nitish Jain

Essaye ça,

def funcion(a):
 print "Hola mundo" + str(a)

[...]
btn_brow_4.clicked.connect(lambda: funcion(12))
0
mg1