PyQtを使ってPythonで絵を描く|Pythonでやってみる

Python独学ならTech-Joho TOP > いろいろやってみた >PyQtを使ってPythonで絵を描く


PyQtとは

PyQtは、クロスプラットフォームのGUI開発ツール、Qt(キュート)をPythonから操るためのライブラリです。
PyQtのPythonバインディングという言い方をします。
Qtを使うと、クロスプラットフォーム、つまりOSにとらわれず、Windows、MacOS、Linuxなど、様々な環境で動く、グラフィカルなアプリを作ることができます。

What is PyQt?

Qt 公式ページ


1.Pythonの実行環境の準備

PyQtをインストール刷る前に、Pythonをパソコンにインストールする必要があります。

Pythonのインストール方法は、下の記事で解説していますので、こちらをご覧ください。
pygameを使ってPythonで絵を描く


2.PyQtインストール

PyQtのインストールは、自分でビルドするなどいろいろな方法があるようですが、pipでインストールする方法の例を紹介します。

参考
PyQt5とpython3によるGUIプログラミング[0]

最新のPyQt5をインストールします。

$ pip install PyQt5

こんな風に、Successfully installed PyQt5-5xxxと表示されれば、インストール成功です。

Installing collected packages: sip, PyQt5
Successfully installed PyQt5-5.10.1 sip-4.19.8

3.まずは絵を書いてみる

これまでにこのブログで取り上げた例と同じく、横300px、縦200pxの矩形のウインドウを表示し、
左上から右に10px、下に10pxの位置に、幅20px、高さ50pxの縦長の長方形を描きます。
pygameの例kivyの例

下の内容のファイルtkintertest.pyを作成して下さい。
pyqttest.py

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QWidget

class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("This is a pyqt sample")
        self.setGeometry(0, 0, 300, 200)

    def paintEvent(self, event):
        p = QPainter(self)
        p.setPen(Qt.yellow)
        p.setBrush(Qt.yellow)
        p.drawRect(10, 10, 20, 50)

app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())

次に、ファイルを保存したディレクトリで下のコマンドを実行してください。

>>> python pyqttest.py

今回は、ウインドウの位置も指定していますので、画面の左上にこのようにウインドウが表示されるはずです。
pyqt window

参考
PyQtでのグラフィックス その1 (QWidgetに直接描画する)


4.解説

では、プログラムのコードのそれぞれの具体的な処理内容を解説していきます。

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QWidget

最初は必要なモジュールをインポートしていきます。

sysはpythonの基本的なモジュールで、今回のプログラムではQtのウインドウを閉じた時にPythonプログラムを終了するために使います。

その他の3行は、Qtの必要なクラスです。Qtはその名の通りQtのメインのクラス、QpainterはQtでいろいろな図形を描く時に使うクラス、QApplicationはQtのアプリ自体を表すクラス、QWidgetはQtのGUI部品、例えばウインドウを表すクラスです。

参考
29.1. sys — システムパラメータと関数
QPainter Class

class MainWindow(QWidget):

QWidgetを継承したクラスMainWindowを作っています。
このクラスはウインドウ自体を表しています。

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("This is a pyqt sample")
        self.setGeometry(0, 0, 300, 200)

ウインドウのコンストラクタです。
ウインドウのクラスのインスタンスを作成する時、実行されます。

setWindowTitleでウインドウのタイトルを指定し、setGeometryで、ウインドウの位置と大きさを指定します。
最後の2つの引数が幅と高さです。

    def paintEvent(self, event):
        p = QPainter(self)
        p.setPen(Qt.yellow)
        p.setBrush(Qt.yellow)
        p.drawRect(10, 10, 20, 50)

このメソッドは、このクラスのウィジェット画鋲がされるたびに呼び出されるイベントハンドラーです。
内部では、QPainterクラスのインスタンスを用いて矩形を描いています。

p.setPen(Qt.yellow)で、輪郭線を黄色に、p.setBrush(Qt.yellow)で塗りつぶしを黄色にしています。
p.drawRect(10, 10, 20, 50)でく形を描き、引数で一番左からx座標、y座標、幅、高さを指定しています。
Qtの座標系は左上原点のようです。

参考
oid QWidget::paintEvent(QPaintEvent *event)

app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())

最後はQtのアプリケーションと、作ったウインドウのクラスのインスタンスを作って、ウインドウを表示しています。

最後の、sys.exit関数はPythonプログラムを終了します。
引数のapp.exec_()はQtのアプリケーションを実行します、
またウインドウが閉じた時に返り値を返すので、これを引数に指定したsys.exitが続いて実行されるようにしています。

参考
sys.exit

int QApplication::exec()


参考


Author: 管理

tech-joho.infoの管理人です。いろいろな技術について勉強しています。