2013-02-26 82 views
9

मैं इसमें नया हूं ... जब मैं "btn_brow_3" पर क्लिक करता हूं तो मैं फ़ंक्शन "funcion" कहूंगा, मैं यह कैसे कर सकता हूं? कोई मेरी मदद कर सकता है?बटन दबाए जाने पर फ़ंक्शन को कॉल करें - pyqt

त्रुटि प्रकार की त्रुटि कनेक्ट() स्लॉट तर्क एक प्रतिदेय या एक संकेत नहीं "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

क्यूटी संकेतों तर्क है कि स्लॉट को दे दिया जाएगा हो सकता है वे जुड़े हुए हैं; एक उदाहरण 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)) 

नोट क्यूटी भी ऐसा करने का तरीके प्रदान करता है, लेकिन (कम से कम मेरे लिए) अजगर वेरिएंट को पढ़ने में आसान कर रहे हैं ।

संपादित करें: कुछ अधिक जानकारी: 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