Python 按下按钮时调用函数 - pyqt

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15080731/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-18 13:16:15  来源:igfitidea点击:

call a function when a button is pressed - pyqt

pythonfunctionbuttonpyqt

提问by user2109621

I′m new in this... I would call function "funcion" when I click "btn_brow_3" How could I do that? Somebody can help me?

我是新来的......当我点击“btn_brow_3”时我会调用函数“funcion”我怎么能这样做?有人可以帮助我吗?

Error TYPE ERROR connect() slot argument should be a callable or a signal not "nonetype"

错误类型错误 connect() 插槽参数应该是可调用的或不是“nonetype”的信号

Regards 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()

回答by rainer

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 canhave 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.

Qt 信号可以有参数传递给它们所连接的插槽;一个例子是新值作为信号中的参数changed。因此,虽然您可以拥有带参数的插槽,但在将信号连接到插槽时无法定义这些参数的实际值,因为它们将在发出信号时定义。

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)

As a side note: wrapperdoes not use braces here: the function is not called, but simply passed as an argument to the function connect. In your code, you calledyour function funcion, which returns nothing (=None), which was passed to connectin your original code, resulting in the error message you received.

附带说明:wrapper此处不使用大括号:不调用函数,而只是将其作为参数传递给函数connect。在您的代码中,您调用了您的 function funcion,它不返回任何内容 (= None),它connect在您的原始代码中传递给了您,从而导致您收到错误消息。

To make that a bit cleaner, you can also use an anonymous function:

为了更简洁,您还可以使用匿名函数:

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

Note that Qt also provides ways of doing this, but (at least for me) the Python variants are easier to read.

请注意,Qt 也提供了执行此操作的方法,但(至少对我而言)Python 变体更易于阅读。

Edit:Some more information: http://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/

编辑:更多信息:http: //eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slot/

回答by Nitish Jain

You can use below method to access the same:

您可以使用以下方法访问相同的内容:

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

def callingFunction():
    function(12)

回答by mg1

Try This,

尝试这个,

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

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