pyQt

はじめに


画面をまずは作ろうと思い、pyQt5を勉強することにしました。 動きが見えた方がやる気が出るので(笑)

pyQt5の説明からすると、 Qt(キュート)というC++GUIツール開発のための クロスプラットフォームフレームワークPython向けにバインディングしたものです。

要は、簡単にGUIツールが作れるフレームワークということです。

環境整備


Anacondaを使って行きます。Spyderで実行します。 Anacondaについてもいずれ軽く触れたいですね。

AnacondaをインストールしていればpyQt5はすでに使用できるはずです。

※使用するにはPython 2.6以上が必要

pyQt5を動かしていきましょう!


以下が基本的な書き方となる

import sys
from PyQt5.QtWidgets import QApplication, QWidget

if __name__ == '__main__':

    app = QApplication(sys.argv)
    widget = QWidget()
    widget.resize(250, 150)
    widget.move(300, 300)
    widget.setWindowTitle('sample')
    widget.show()
    sys.exit(app.exec_())

実行すると以下の画面が表示される f:id:glegle-official:20200715144131p:plain

解説


appを宣言

    app = QApplication(sys.argv)

画面を定義

    widget = QWidget()
    widget.resize(250, 150)
    widget.move(300, 300)
    widget.setWindowTitle('sample')

表示(show)

    widget.show()

終了処理

    sys.exit(app.exec_())

画面はクラス化して管理!

先ほどと同じ画面が表示される

import sys
from PyQt5.QtWidgets import QApplication, QWidget

class ExampleWidget(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.resize(250, 150)
        self.move(300, 300)
        self.setWindowTitle('sample')
        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ew = ExampleWidget()    
    sys.exit(app.exec_())
    

pyQt5でアプリを作ってみよう!


Qtの3大機能


Qtの重要な機能は、「signal」「connect」「slot」の3つである。 特定のイベントを「signal」に、イベントをトリガに呼び出す関数を「slot」に定義する。 「signal」と「slot」を結びつけるのが「connect」である。

以下を実行すると、 「Clear!!」ボタンを押すことで、「connected」の文字が消える機能を持った画面が作成されます

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout, QLabel

class ExampleWidget(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.resize(250, 150)
        self.move(300, 300)
        self.setWindowTitle('sample')

        # buttonの設定
        self.button = QPushButton('Clear!!')
        self.label = QLabel('connected')

        # buttonのclickでラベルをクリア
        self.button.clicked.connect(self.label.clear)

        # レイアウト配置
        self.grid = QGridLayout()
        self.grid.addWidget(self.button, 0, 0, 1, 1)
        self.grid.addWidget(self.label, 1, 0, 1, 2)
        self.setLayout(self.grid)

        # 表示
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ew = ExampleWidget()    
    sys.exit(app.exec_())

f:id:glegle-official:20200715141406p:plain

「Clear!!」ボタン押下 f:id:glegle-official:20200715141749p:plain

各関数の使い方


マニュアルのリンクを貼っておきます。
PyQt5 Reference Guide — PyQt v5.15.0 Reference Guide

実際にボタンなどを配置してみたソースも参考程度に貼っておきます。 解説はまた時間があるときにでも。。

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QMainWindow,
                             QPushButton, QMessageBox, QLineEdit,
                             QAction, QTableWidget, QTableWidgetItem,
                             QVBoxLayout
                             )
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtGui import QIcon

class App(QMainWindow):

    def __init__(self):
        super().__init__()
        self.title = "PyQt5 status bar example - pythonspot.com"
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 480
        self.initUI()

    def initUI(self):
        # ステータスバー配置
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.statusBar().showMessage("Message in statusbar.")

        # メニューバー配置
        mainMenu = self.menuBar() 
        fileMenu = mainMenu.addMenu("File")
        editMenu = mainMenu.addMenu("Edit")
        viewMenu = mainMenu.addMenu("View")
        searchMenu = mainMenu.addMenu("Search")
        toolsMenu = mainMenu.addMenu("Tools")
        helpMenu = mainMenu.addMenu("Help")

        exitButton = QAction("Exit", self)
        exitButton.setShortcut("Ctrl+Q")
        exitButton.setStatusTip("Exit application")
        exitButton.triggered.connect(self.close)
        fileMenu.addAction(exitButton)
        mainMenu.setNativeMenuBar(False) #macではこのコマンドがないと表示されない
        
        # テキストボックス配置
        self.textbox = QLineEdit(self)
        self.textbox.move(20, 20)
        self.textbox.resize(280,40)

        # ボタン配置
        self.button = QPushButton("Show text", self)
        self.button.move(20,80)
        self.button.clicked.connect(self.on_click)

        # 画面表示
        self.show()

    @pyqtSlot()
    def on_click(self):
        textboxValue = self.textbox.text()
        QMessageBox.question(self, "Message - pythonspot.com",
                             "You typed: " + textboxValue, 
                             QMessageBox.Ok, QMessageBox.Ok
                             )
        self.textbox.setText("")
        

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())