webentwicklung-frage-antwort-db.com.de

funktion aufrufen, wenn eine Taste gedrückt wird - pyqt

Ich bin neu in diesem ... Ich würde die Funktion "Funktion" nennen, wenn ich auf "btn_brow_3" klicke. Wie kann ich das tun? Kann mir jemand helfen?

Fehler TYPE ERROR connect () Slot-Argument sollte ein aufrufbares oder ein Signal sein, das nicht "nonetype" ist.

Viele Grüße 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

Qt-Signale können Argumente enthalten, die an die Steckplätze weitergeleitet werden, mit denen sie verbunden sind. Ein Beispiel wäre der neue Wert als Argument in einem Signal changed. Während Sie can einen Slot mit Argumenten haben, können Sie daher nicht die tatsächlichen Werte derjenigen festlegen, wenn Sie das Signal mit dem Slot verbinden, da diese beim Senden des Signals definiert werden.

Um ein Argument zur Verbindungszeit zu definieren, können Sie eine zusätzliche Funktion verwenden, die nichts anderes tut, als die ursprüngliche Funktion mit dem definierten Argument aufzurufen:

def wrapper():
    funcion(12)

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

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

Als Randbemerkung: wrapper verwendet hier keine geschweiften Klammern: Die Funktion wird nicht aufgerufen, sondern einfach als Argument an die Funktion connect übergeben. In Ihrem Code haben Sie aufgerufen Ihre Funktion funcion, die nichts (= None) zurückgibt, das in Ihrem ursprünglichen Code an connect übergeben wurde, was zu einer Fehlermeldung führt.

Um das etwas sauberer zu machen, können Sie auch eine anonyme Funktion verwenden:

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

Beachten Sie, dass Qt dies auch bietet, aber die Python-Varianten sind (zumindest für mich) einfacher zu lesen.

Edit: Weitere Informationen: http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/

13
rainer

Sie können die Methode unten verwenden, um auf dieselbe zuzugreifen:

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

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

Versuche dies,

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

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