Python独学ならTech-Joho TOP > いろいろやってみた >PyQtを使ってPythonで絵を描く
PyQtとは
PyQtは、クロスプラットフォームのGUI開発ツール、Qt(キュート)をPythonから操るためのライブラリです。
PyQtのPythonバインディングという言い方をします。
Qtを使うと、クロスプラットフォーム、つまりOSにとらわれず、Windows、MacOS、Linuxなど、様々な環境で動く、グラフィカルなアプリを作ることができます。
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
今回は、ウインドウの位置も指定していますので、画面の左上にこのようにウインドウが表示されるはずです。
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