PythonでGUI開発ができるツールキットであるPyQtについて概要を紹介します。
PyQtとは
PyQtは、クロスプラットフォームなGUIツールキットであり、Windows、Linux、Mac等様々なOSで動作可能なGUIプログラムを作成することができます。
PyQtは、「Qt(キュート)」というGUIツールキットをPythonプログラムから利用できるようにしたものです。まずは、そもそものQtについて説明して、その後にPyQtの概要を説明しようかと思います。
Qt(キュート)について
Qt(キュート)とは、クロスプラットフォームに対応したC++のGUIツールキットでハバード・ノード(Haavard Nord)とエリック・チェンエン(Eirik Chambe-Eng)によって開発されました。Qtが最初に世に出たのは1995年のことです。私が初めてQtを知ったのは大学/大学院時代にC++の勉強をしていてGUIで使えるツールないか探していた時でしたので2010年頃であったのを覚えています。
Qtはスタイリッシュな画面が作れることが特徴で、Qtが使用されているアプリケーションで有名なのはLinuxのデスクトップ環境であるKDEやコミュニケーションツールのSkypeあたりがあるかなと思います。
Qtは、画面オブジェクト間の接続にシグナルとスロットという考え方を採用しています。ボタンなどを押したときにシグナルが発生して、スロットとなる関数が動作するような形で、理解できると非常に感覚的にプログラミングができるようになってきます。
本記事の主題であるPyQtは、Qtの機能をPythonで使用できるようにしているもので、私は過去にQtを勉強したことがある流れから、PythonでのGUI開発を勉強しようとなった時にPyQtをまず学びました。本記事の以降ではPyQtについて紹介していきます。
PyQt概要
PyQtは、クロスプラットフォームなGUIツールキットであり、Windows、Linux、Mac等様々なOSで動作可能なGUIプログラムを作成することができます。本記事作成時点では、PyQt6が最新バージョンです。
PythonのGUIツールキットとして他にも有名どころとしては以下があります。
tkinter(ティーケーインターやティーキンターと呼ばれます)はTcl/TkというGUIツールキットを扱えるようにしたPython標準のGUIツールキットです。
Python Software FundationとJetBrainsが共同実施している2021 年 Python 開発者アンケートの結果の「その他フレームワークとライブラリ」という項目では、Tkinter、PyQt、Kivy、wxPythonという順番のようでPyQtは標準のtkinterと同じレベルで使われているGUIツールキットとみることができます。
では、PyQtの概要について以降で簡単に見ていきましょう。
PyQtは、Pythonライブラリとして提供されており、以下のようにpipでインストールできるようになっています。
pip install pyqt6
PyQtは、OSSとして利用ができ、ライセンスとしては、GPL(GNU General Public License)が採用されています。GPLはソースコードの公開する必要が出てくる可能性があるので企業で使用する場合には注意が必要です。企業での使用の場合はLGPLが採用されている後述のPySideの方が適しているかもしれません。
PyQtはGUIツールキットですが、ベースとなるGUI開発の機能の他にも非常に多くの機能が提供されています。例えば、以下のようなものです。
- データベース処理(QtSQL)
- ネットワーク(QtNetwork)
- マルチメディア(QtMultimedia)
- マルチスレッディング(QTimer, QThread)
- 2Dグラフィックス(Qpainter)
- 3Dグラフィックス(QtOpenGL)
- チャート描画(QtCharts)
- ウェブブラウジング(QtWebEngine)
データベースやネットワーク、グラフィックス、マルチメディア等の対応もできるようなライブラリ群が用意されています。
イメージのために簡単なプログラムを見てみましょう。
import sys from PyQt6 import QtCore as qtc from PyQt6 import QtGui as qtg from PyQt6 import QtWidgets as qtw class MainWindow(qtw.QWidget): """メインウィンドウ""" def __init__(self): """コンストラクタ""" super().__init__() self.setWindowTitle("Hello, World!") self.resize(320, 240) label = qtw.QLabel(self) label.setText("サンプルプログラム!") # 画面表示 self.show() if __name__ == "__main__": app = qtw.QApplication(sys.argv) mw = MainWindow() sys.exit(app.exec())
【実行結果】
上記のように非常に短いプログラムで画面表示ができるGUIプログラミングを始めることができます。
PySide概要
Qtの機能をPythonで使用するもう一つの方法として「PySide」というものがあります。PyQtに対応しつつ開発されており、PyQt6に対応するものとしてはPySide6があります。
PySideとPyQtの大きな違いとしてはライセンスの違いがあります。上記でも説明した通りPyQtはGPLですが、PySideはLGPL(Lesser GPL)です。ソースコードの公開の観点でLGPLはGPLよりも緩和されており、適切に使用すればソースコードを公開する必要はありません。企業で採用する場合にはPySideの方が適している場合がありますので検討するようにしてみてください。
なお、PySideは、PyQtとは使用方法など非常に似ているので、PyQtを勉強していれば少しの変更で使用することができます。
PySideも、Pythonライブラリとして提供されており、以下のようにpipでインストールできるようになっています。
pip install pyside6
PyQtの説明で紹介した簡単なプログラムをPySide版にしてみましょう。
import sys from PySide6 import QtCore as qtc from PySide6 import QtGui as qtg from PySide6 import QtWidgets as qtw class MainWindow(qtw.QWidget): """メインウィンドウ""" def __init__(self): """コンストラクタ""" super().__init__() self.setWindowTitle("Hello, World!") self.resize(320, 240) label = qtw.QLabel(self) label.setText("サンプルプログラム!") # 画面表示 self.show() if __name__ == "__main__": app = qtw.QApplication(sys.argv) mw = MainWindow() sys.exit(app.exec())
【実行結果】
上記、PyQt版と違うのはインポートしているのがPyQt6かPySide6かの違いだけです。より複雑なプログラムの場合には、PyQtとPySideで違いが出る部分があるかと思いますが、上記のように同じような感じで使えるということをご理解いただければよいかと思います。
まとめ
PythonでGUI開発ができるツールキットであるPyQtについて概要を紹介しました。
PyQtは元々はC++のGUIツールキットのQt(キュート)をPythonで使用できるようにしたものでスタイリッシュなGUIプログラム開発ができます。
PyQtはライセンスがGPLのため企業での使用は注意が必要ですが、LGPL版のPySideもありますので使用用途に合わせて選択肢に入れて検討してもらえるとよいのかなと思います。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。