私はこれに新しいです...「btn_brow_3」をクリックすると、関数「関数」を呼び出します。どうすればそれができますか?誰かが私を助けることができますか?
エラーTYPEエラーconnect()スロット引数は呼び出し可能か、「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()
Qtシグナルには、接続先のスロットに渡される引数を含めることができます。例は、信号changed
の引数としての新しい値です。したがって、canは引数付きのスロットを持つことができますが、信号をスロットに接続するときにそれらの実際の値を定義することはできません。
接続時に引数を定義するには、定義された引数で元の関数を呼び出す以外の何もしない追加の関数を使用できます。
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 /
以下のメソッドを使用して同じものにアクセスできます。
self.connect(btn_brow_4,Qt.SIGNAL("clicked()"),self.callingFunction)
def callingFunction():
function(12)
これを試して、
def funcion(a):
print "Hola mundo" + str(a)
[...]
btn_brow_4.clicked.connect(lambda: funcion(12))