按下按钮时调用函数 [英] Calling a function upon button press
问题描述
当我单击 btn_brow_3
时,我试图调用函数 funcion
.我怎么能做到这一点?
I am trying to call function funcion
when I click btn_brow_3
. How could I accomplish this?
运行以下代码时,我收到此错误消息:TypeError: connect() 槽参数应该是可调用的或不是nonetype"的信号
When running the following code, I receive this error message:
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()
推荐答案
Qt 信号可以有参数,这些参数将传递给它们所连接的插槽;一个例子是新值作为信号 changed
中的参数.因此,虽然您可以有一个带参数的槽,但您不能在将信号连接到槽时定义这些值的实际值,因为它们将在发出信号时定义.
Qt signals can have arguments that will be passed to the slots they are connected to; an example would be the new value as an argument in a signal changed
. Therefore, while you can have a slot with arguments, you cannot define the actual values of those when connecting the signal to the slot, as they will be defined when emitting signal.
为了在连接时定义一个参数,你可以使用一个额外的函数,它只用定义的参数调用原始函数:
For defining an argument at connect time, you can use an additional function which does nothing but calling the original function with the defined argument:
def wrapper():
funcion(12)
def funcion(a):
print "Hola mundo" + str(a)
[...]
btn_brow_4.clicked.connect(wrapper)
附带说明:wrapper
在这里不使用大括号:该函数不被调用,只是作为参数传递给函数 connect
.在你的代码中,你调用你的函数funcion
,它什么都不返回(=None
),它被传递给connect
> 在您的原始代码中,导致您收到错误消息.
As a side note: wrapper
does not use braces here: the function is not called, but simply passed as an argument to the function connect
. In your code, you called your function funcion
, which returns nothing (=None
), which was passed to connect
in your original code, resulting in the error message you received.
为了更简洁,您还可以使用匿名函数:
To make that a bit cleaner, you can also use an anonymous function:
btn_brow_4.clicked.connect(lambda: funcion(12))
请注意,Qt 也提供了执行此操作的方法,但(至少对我而言)Python 变体更易于阅读.
Note that Qt also provides ways of doing this, but (at least for me) the Python variants are easier to read.
更多信息:http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/
这篇关于按下按钮时调用函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!