2013-02-26 2 views
9

저는이 기능이 새로 도입되었습니다 ... "btn_brow_3"을 클릭하면 "funcion"함수를 호출 할 수 있습니까? 어떻게 할 수 있습니까? 누군가 나를 도울 수 있습니까?버튼을 누르면 함수가 호출됩니다 - pyqt

오류 TYPE 에러 연결 (슬롯)의 인자는 호출 또는 신호 없음 "nonetype"이어야

안부 맥시

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() 

답변

10
Qt는 신호 슬롯 전달 될 인자를 가질 수

그들은에 연결되어 있습니다; 예를 들어 신호의 인수로 새 값인 changed이 있습니다. 따라서 에 인수가있는 슬롯을 가질 수 있지만 신호를 슬롯에 연결하면 실제 신호를 정의 할 수 없습니다. 신호를 방출 할 때 정의되므로 슬롯에 신호를 연결할 때 실제 값을 정의 할 수 없습니다.

def wrapper(): 
    funcion(12) 

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

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

보조 노트로 : wrapper 여기에 괄호를 사용하지 않는

연결시 인수를 정의의 경우, 정의 된 인수를 사용하여 원래의 함수를 호출을 제외한 아무것도하지 않는 추가 기능을 사용할 수 있습니다 : 함수는 호출되지 않고 단순히 함수 connect에 대한 인수로 전달됩니다. 코드에서 이라는 함수를 funcion이라고하고 아무 것도 반환하지 않고 원래 코드에서 connect으로 전달 된 오류 메시지가 나타납니다. 파이썬 변형이 쉽게 읽을 수있는 (적어도 나를 위해) Qt는 또한이 일을하는 방법을 제공하지만 것을

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

참고 :

조금 청소기, 당신은 또한 익명의 기능을 사용할 수 있는지 확인하려면 .

편집 : 일부 추가 정보 : http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/

당신은 방법을 아래에 사용할 수 있습니다
3

가 액세스 할 수있는 같은 :

영업의에서 사용 된 나는 새로운 스타일의 신호/슬롯이 튀어 나와 좋을 것
self.connect(btn_brow_4,Qt.SIGNAL("clicked()"),self.callingFunction) 

def callingFunction(): 
    function(12) 
+1

이전 스타일 변형에 대한 코드 http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html을 참조하십시오. – rainer

관련 문제