読者です 読者をやめる 読者になる 読者になる

drilldripper’s blog

機械学習とソフトウェア開発を頑張ってます

PyQtのConnectで引数付きの関数を渡す方法

PyQtではconnectを使ってイベントに対応する関数を呼び出すことが出来ます。しかし引数付きの関数をconnectに直接渡すことは出来ません。以下のようなエラーが発生すると思います。

"TypeError: connect() slot argument should be a callable or a signal, not 'NoneType'"

これを解決するためにはlambdaを使って式にする方法を使います。

以下のようなコードにすればよいでしょう。

# -*- coding: utf-8 -*
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class MyForm(QMainWindow):
    def __init__(self, parent=None):
        super(MyForm, self).__init__(parent)
        button = QPushButton('Click')
        # エラーが発生する
        # button.clicked.connect(self.on_click("Hello world"))
        # lambdaを使う
        button.clicked.connect(lambda: self.on_click("Hello world"))

        layout = QHBoxLayout()
        layout.addWidget(button)

        main_frame = QWidget()
        main_frame.setLayout(layout)

        self.setCentralWidget(main_frame)

    def on_click(self, str):
        print(str)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_window = MyForm()
    main_window.show()
    app.exec_()