2013-02-26 79 views
9

我是新來的...當我點擊「btn_brow_3」時,我會調用函數「funcion」我該怎麼做? 有人可以幫助我嗎?當一個按鈕被按下時調用一個函數 - pyqt

錯誤 TYPE ERROR連接()槽參數應該是一個可調用或信號不是「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,它不會返回任何內容(= None),它在您的原始代碼中傳遞給connect,導致您收到錯誤消息。

爲了讓這個有點清潔劑,也可以使用匿名函數:

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

注意,Qt同時也提供了這樣做的方法,但(至少對我來說)Python的變體更易於閱讀。

編輯:一些更多的信息: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

我建議用新型信號/插槽堅持作爲OP的使用對舊式變體進行編碼。請參閱http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html – rainer 2013-02-26 12:09:04

相關問題