19

funcionクリックすると関数を呼び出そうとしていますbtn_brow_3。どうすればこれを達成できますか?

次のコードを実行すると、次のエラーメッセージが表示されます。 TypeError: connect() slot argument should be a callable or a signal not "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()
4

3 に答える 3

28

Qt シグナルは、接続先のスロットに渡される引数を持つことができます。例は、シグナルの引数としての新しい値changedです。したがって、引数を持つスロットを持つことはできますが、シグナルを送信するときに定義されるため、シグナルをスロットに接続するときにそれらの実際の値を定義することはできません。

接続時に引数を定義するために、定義された引数で元の関数を呼び出す以外に何もしない追加の関数を使用できます。

def wrapper():
    funcion(12)

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

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

補足として、wrapperここでは中括弧を使用しません。関数は呼び出されませんが、引数として関数に渡されるだけですconnect。あなたのコードでは、関数を呼び出しましたが、元のコードで渡されたfuncionもの (= ) は何も返されず、受け取ったエラー メッセージが表示されました。Noneconnect

これを少しきれいにするために、無名関数を使用することもできます。

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

Qt もこれを行う方法を提供していますが、(少なくとも私にとっては) Python バリアントの方が読みやすいことに注意してください。

編集:いくつかの詳細情報: http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/

于 2013-02-26T09:12:41.723 に答える
5

以下のメソッドを使用して同じものにアクセスできます。

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

def callingFunction():
    function(12)
于 2013-02-26T09:20:38.300 に答える