2013-02-26 3 views
9

Ich bin neu in diesem ... Ich würde Funktion "funcion" aufrufen, wenn ich auf "btn_brow_3" klicke Wie könnte ich das tun? Jemand kann mir helfen?rufen Sie eine Funktion auf, wenn eine Taste gedrückt wird - pyqt

Fehler TYPE ERROR connect() Schlitz Argument sollte eine aufrufbare oder ein Signal sein, nicht "nonetype"

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 __name__ == '__main__': 
    main() 

Antwort

10

Qt Signale können Argumente haben, die zu den Schlitzen geführt wird sie sind verbunden mit; ein Beispiel wäre der neue Wert als Argument in einem Signal changed. Daher können Sie, während Sie einen Steckplatz mit Argumenten haben, nicht die tatsächlichen Werte dieser beim Verbinden des Signals mit dem Steckplatz definieren, da diese beim Aussenden des Signals definiert werden.

für ein Argument zur Verbindungszeit definieren, können Sie eine zusätzliche Funktion benutzen, die nichts tut, sondern die ursprüngliche Funktion mit dem definierten Argumente Aufruf:

def wrapper(): 
    funcion(12) 

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

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

Als Randbemerkung: wrapper Klammern hier nicht verwenden: Die Funktion wird nicht aufgerufen, sondern einfach als Argument an die Funktion connect übergeben. In Ihrem Code genannt Ihre Funktion funcion, die nichts zurückgibt (= None), die an connect in Ihrem ursprünglichen Code übergeben wurde, was zu der Fehlermeldung, die Sie erhalten haben.

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

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

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

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

3

Sie unter Methode verwenden können, um den Zugriff auf gleiche:

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

def callingFunction(): 
    function(12) 
+1

Ich würde vorschlagen, mit neuen Stil Signale/Slots stecken, wie in der OPs verwendet Code über die Old-Style-Variante. Siehe http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html – rainer

Verwandte Themen