2013-02-26 43 views
9

Tôi mới sử dụng chức năng này ... Tôi sẽ gọi chức năng "funcion" khi tôi nhấp vào "btn_brow_3" Tôi làm cách nào để thực hiện điều đó? Ai đó có thể giúp tôi?gọi chức năng khi nhấn nút - pyqt

Lỗi LOẠI LỖI connect() lập luận khe phải là một callable hoặc một tín hiệu không phải là "nonetype"

Trân 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() 

Trả lời

10

tín hiệu Qt có thể có đối số sẽ được chuyển đến các khe chúng được kết nối với; một ví dụ sẽ là giá trị mới làm đối số trong tín hiệu changed. Do đó, trong khi bạn có thể có một vị trí với đối số, bạn không thể xác định giá trị thực tế của các giá trị đó khi kết nối tín hiệu với vị trí, vì chúng sẽ được xác định khi phát tín hiệu.

Đối với việc xác định một cuộc tranh cãi vào thời điểm kết nối, bạn có thể sử dụng một chức năng bổ sung mà không làm gì nhưng gọi hàm ban đầu với đối số định nghĩa:

def wrapper(): 
    funcion(12) 

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

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

Như một mặt lưu ý: wrapper không sử dụng dấu ngoặc ở đây: chức năng không được gọi, nhưng chỉ đơn giản là thông qua như một đối số cho hàm connect. Trong mã của bạn, bạn được gọi là chức năng của bạn funcion, không trả về gì (= None), được chuyển đến connect trong mã ban đầu của bạn, dẫn đến thông báo lỗi bạn nhận được.

Để thực hiện điều đó một chút bụi, bạn cũng có thể sử dụng một chức năng ẩn danh:

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

Lưu ý rằng Qt cũng cung cấp nhiều cách để làm điều này, nhưng (ít nhất là đối với tôi) các biến thể Python là dễ dàng hơn để đọc .

Edit: Một số biết thêm thông tin: http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/

3

Bạn có thể sử dụng dưới phương pháp tiếp cận như nhau:

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

def callingFunction(): 
    function(12) 
+1

tôi muốn đề nghị gắn bó với tín hiệu kiểu mới/khe như được sử dụng trong OP của mã trên biến thể kiểu cũ. Xem http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html – rainer

Các vấn đề liên quan