皆さんは、GUIアプリを作りたいと思ったことはありますか?
Python で GUIアプリを作成したい!と考えた時に、ライブラリが豊富にある Python の環境では GUI ライブラリもたくさんあるので、その中からどれを使うか選択する必要が出てきます。
そこで今回は、その中の1つである 「PyQt」 について紹介していきたいと思います。
ぜひ、ライブラリを選ぶうえで参考にしてみてください。
PythonのPyQtとは?
「PyQt(パイキュート)」とは、PythonでGUIアプリを開発するためのライブラリの1つです。
Pythonには様々なGUIライブラリが用意されていますが、PyQtはその中でも機能性やデザイン性の高いGUIアプリを作成することができるライブラリのため、さまざまな場面で活用されています。
PyQtで作成するGUIアプリはクロスプラットフォーム対応のため、Windows や MacOS、Linux などの異なるプラットフォーム上で動作させることができます。
現在の最新バージョンはPyQt 6です。
Qtとは?
Qt とは、C++をベースとしたGUIアプリケーション開発フレームワークです。
Qt を用いて作られたアプリケーションはクロスプラットフォーム対応となっており、それぞれのプラットフォーム向けにビルドすることによって、様々な環境下で同じ機能を動作させることができます。
この Qt を Pythonで使用できるようにしたものが、PyQtです。
GUIとは?
PyQt は GUIアプリを開発するためのライブラリであると解説をしましたが、 「そもそも、GUI って何?」 と疑問に感じている方も中にはいるかもしれません。
GUI とは、グラフィカルユーザーインターフェース(Graphical User Interface)の略語で、ユーザーインターフェース(UI)の中の一種に含まれます。
UI とは、ユーザーとコンピューターの間で情報をやり取りするために使用する様々な入出力の仕組みのことを指し、マウスやキーボード、あるいはマイクやスピーカーなどの音声機器から皆さんが今眺めているディスプレイなどの画面表示機器まで、その種類は多岐に渡ります。
また、UI は上記に挙げたような機器類に限らず、webページやアプリ画面上のレイアウト表示や、ユーザーの操作に対する反応なども定義に含まれます。
GUI はこれらの UI の中でも、コンピュータへ出す命令を視覚的に操作できるもののことを指します。
例えば、PCでのカーソル操作やスマートフォンでのタッチ操作など、コンピューターへの指示を直感的に行える機能全般がGUI に当たります。
PyQt を使用すると、ウィンドウ、ボタン、チェックボックス、テキストボックスといった、クリックやタッチなどで操作可能な要素を配置したアプリケーションを作成することができるのです。
PyQtを使用するメリット・デメリット
PyQt を使用することで得られるメリットや、反対にデメリットとなってしまう点がいくつかあります。
それぞれのポイントを説明するので、PyQt を導入するか否かの1つの参考にしてみてください。
PyQtのメリット
PyQt を使用するメリットの1つ目は、既に何度も解説をしていますが、使用環境に依存しないアプリケーション開発ができる点です。
対応しているプラットフォームも多岐に渡るため、デスクトップやスマートフォン、組込機器など多くの環境で利用が可能となっています。
2つ目のメリットは、機能が豊富でデザイン性が高い点です。
デザインの自由度が他のGUIライブラリと比べても高めの傾向にあり、現在も積極的に開発・アップデートを行い最適化が図られているため、旧式のライブラリなどでは実装が難しい内容でも、比較的容易に開発を行うことができます。
PytQtのデメリット
一方、PyQt を使用した場合のデメリットの1つ目は、動作速度が遅くなる傾向にある点です。
GUIアプリケーションのため、必然的にグラフィックス処理を行わなければならず、コードのみでの実行と比べて動作が重くなってしまいます。
加えて、PyQt で作成した GUIアプリケーションは、 C++で開発したものと比べて動作速度が低い水準にあるため、複雑なアプリケーションの作成には不向きな傾向にあります。
2つ目のデメリットは、ライセンス関連の条件が厳しい点です。
PyQt は GPLライセンスであるため、無料で使用する場合は商用・非商用に関わらず全てのソースコードを公開しなければなりません。
上記を回避するには商用ライセンスを有償で取得する必要があるため、商用利用の場合は実質的に開発費用が多くかかることになります。
3つ目のデメリットは、日本語のリファレンスが存在しない点です。
公式ドキュメントは全て英語のため、詳しい情報を収集したい際に、日本語では取得できないケースが多々あります。
「日本語に対応していないと困ってしまう」 という人にとっては、扱いが難しい場合があります。
PyQtの導入方法
PyQt の特徴について大まかに説明したところで、実際の導入方法についても解説していきたいと思います。
(※今回の記事では、MacOS環境下にて PyQt6系統 を導入する前提で解説をするため、導入環境やバージョンによっては動きが異なる場合があります)
事前準備として、Python が既にインストールされている必要があります。
インストール済みかどうかを確認するには、以下のコマンドを使用しましょう。
python --version
インストールされている Pythonが Python3系統の場合、上記のコマンドを実行すると以下のようなエラーが出る場合があります。
zsh: command not found: python
pythonコマンドが Python3にリンクされていないために発生するエラーです。
そのため、正確には以下のようにコマンドを入力する必要があります。
python3 --version
【Pythonがインストールされていない場合の対処法】
WindowsやMacOSを使用していて、Python3がまだインストールされていない場合は以下の方法でインストールしましょう。
- 公式からインストーラーをダウンロードする
- (Windowsのみ)wingetでインストールする
- (MacOSのみ)Homebrewでインストールする
【公式からインストーラーをダウンロードする】
こちらはOSに関わらず利用できる、もっとも簡単な方法です。
こちらからPythonの公式サイトにアクセスし、 “Downloads” の項目で使用しているOSを選んでインストーラーをダウンロードしましょう。
ただし、こちらの方法を使用するとPythonのアップデートのたびにインストーラーをダウンロードしなおすことになるため、少々手間がかかります。
この他にも、OSごとにコマンドラインでインストールする方法があります。
【wingetでインストールする(Windows)】
Windowsでは、Windows 10/11で利用できる winget というパッケージマネージャーがあります。これを利用することで、インストールやアップデートがターミナルから簡単に行えます。
まずは以下のコマンドをコマンドプロンプトかPowerShellで打ち込んでみましょう。
winget search python
すると、大量にパッケージが並んだリストが表示されると思います。この中で、左から二番目に表示されているIDが “Python.Python.3.xx” となっているものを確認しましょう。”xx”の部分の数字が最も大きいものをドラッグして右クリックしたら、IDをコピーできます。
次に、以下のコマンドを入力しましょう。本記事の執筆時点ではPythonの最新バージョンは3.13.3なのでパッケージのIDは Python.Python.3.13 ですが、IDの部分は実際の最新バージョンに合わせて変えてください。
winget install Python.Python.3.13
これでPythonのインストーラーが自動的に立ち上がるので、あとは指示に従ってインストールを完了しましょう。
【Homebrewを使用する(MacOSのみ)】
次に、MacOSでのインストールの方法です。
こちらはHomebrewというパッケージマネージャーを利用すると、簡単にインストールすることができます。
ターミナルを立ち上げたら、次のコマンドを入力しましょう。
brew install python
これで最新のバージョンのPythonと、パッケージマネージャーの pip3 がインストールされるはずです。
Pythonのインストールが完了したら、次に以下のコマンドを入力しましょう。
pip install PyQt6
こちらも、先ほどと同様の理由でエラーが発生する可能性があるため、実行できなかった場合には以下のどちらかの方法でインストールしてみてください。
pip3 install PyQt6
もしくは
python3 -m pip install PyQt6
ただし、pipコマンドを実行すると、次のようなエラーが発生する場合があります。

要約すると、「直接pipでインストールせず、仮装環境でインストールしてください」 といった旨の内容が書かれています。
このエラーを解決するには、主に2つの方法があります。
1つは、指示の通りに仮想環境を構築してインストールする方法です。
公式にも推奨されている通り、基本的にはこちらの方法でインストールする方が、安全にパッケージ管理を行うことができます。
この方法でインストールする場合は、エラー文にもある以下の3つのコマンドを実行しましょう。
python3 -m venv (パス/ファイル名) # 仮想環境用のファイル群を指定のパスに生成
source (パス/ファイル名)/bin/activate # 仮想環境を起動
python3 -m pip install PyQt6
インストールが完了したら、「deactivate」 で仮想環境を終了できます。
もう1つの解決方法は、pipのコマンドの後ろに 「–break-system-packages」 オプションを付けて実行する方法です。
仮想環境を使えない場合は、こちらの方法でインストールすることになります。
PyQtでGUIを作成する
無事にインストールが完了したら、PyQt で実際にGUIアプリケーションを作成してみましょう。
ここからは、サンプルコードを交えて基本的な使い方を解説していきます。
テンプレートの基本構造を理解する
アプリケーション画面が表示されないことには何も始まりませんので、まずはメインウィンドウを画面上に表示させる方法から見ていきましょう。
細かいレイアウトについては一旦考えず、ただウィンドウを画面に表示させるだけであれば、以下のコードのみで簡単に実装することができます。
【サンプルコード】
import sys
from PyQt6.QtWidgets import *
if __name__ == "__main__":
app = QApplication(sys.argv) # アプリケーションを開始
window = QWidget() # メインウィンドウのインスタンスを作成
window.show() # メインウィンドウを表示
sys.exit(app.exec()) # イベント完了時にアプリケーションを終了する
【実行結果】

このように、ウィンドウが画面に表示されれば成功です。
これを元に、ラベルやボタンなどの必要なウィジェットを配置してレイアウトを調整していきます。
実際にGUIアプリを作成する際は、クラスの継承を行なった上で調整するようにましょう。
【サンプルコード】
import sys
from PyQt6.QtWidgets import *
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("サンプルプログラム") # ウィンドウのタイトルを設定
self.setGeometry(
100, 100, 540, 380
) # ウィンドウの表示位置(x,y)と大きさ(w,h)を設定
self.label1 = QLabel(self) # ラベルを配置
self.label1.setText("Hello World!") # ラベルのテキストを設定
self.label1.adjustSize() # テキストに合わせてラベルサイズを変更
self.label1.move(50, 40) # ラベルの表示位置を変更
self.label2 = QLabel(self)
self.label2.setText("これはサンプルです。")
self.label2.adjustSize()
self.label2.move(50, 80)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
【実行結果】

このように、ウィンドウのタイトルを変更したり、表示位置やサイズを調整することも可能です。
上記のサンプルでは一例としてラベルを配置していますが、他にも様々なウィジェットを活用することができます。
チェックボックスを作成しよう
配置できるウィジェットの種類は様々ですが、今回はその中の1つであるチェックボタンについて紹介したいと思います。
PyQtでチェックボタンを使用したい場合は、QCheckBoxオブジェクトを生成して配置しましょう。
【サンプルコード】
import sys
from PyQt6.QtWidgets import *
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("サンプルプログラム")
self.setGeometry(100, 100, 540, 380)
self.createCheckbox()
def createCheckbox(self):
# チェックボックスを配置
self.checkbox1 = QCheckBox(self)
self.checkbox1.setText("サンプルボックス1")
self.checkbox1.adjustSize()
self.checkbox1.move(200, 40)
self.checkbox1.setChecked(True) # 初期時にチェック済みの状態にする
self.checkbox2 = QCheckBox(self)
self.checkbox2.setText("サンプルボックス2")
self.checkbox2.adjustSize()
self.checkbox2.move(200, 80)
self.checkbox3 = QCheckBox(self)
self.checkbox3.setText("サンプルボックス3")
self.checkbox3.adjustSize()
self.checkbox3.move(200, 120)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
【実行結果】

生成した段階で、チェック状態をオン・オフにする機能が自動で実装されます。
また、「setChecked()」 で初期値を設定することも可能です。
ただし、チェック状態を変更した際に何かしらの処理を行いたい場合には、「stateChanged」 シグナルを使用して関数を実行する必要があります。
【サンプルコード】
import sys
from PyQt6.QtWidgets import *
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("サンプルプログラム")
self.setGeometry(100, 100, 540, 380)
self.createWidgets()
def createWidgets(self):
# チェックボックスを配置
self.checkbox = QCheckBox(self)
self.checkbox.setText("サンプルボックス1")
self.checkbox.adjustSize()
self.checkbox.move(200, 40)
self.checkbox.stateChanged.connect(self.checkBoxClicked)
self.label = QLabel(self)
self.label.setText("チェック状態:未チェック")
self.label.adjustSize()
self.label.move(200, 80)
def checkBoxClicked(self):
if self.checkbox.isChecked():
self.label.setText("チェック状態:チェック済み")
else:
self.label.setText("チェック状態:未チェック")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
【実行結果】
未チェック時

チェック時

「stateChanged.connect()」 でチェック状態の変化を検知して、指定の関数を実行することができます。
上記のサンプルコードでは、「isChecked()」 で取得したチェック状態に応じて、ラベルの文言を変更する処理を実装しています。
チェックボックスをグループ化しよう
基本的には、複数選択が可能なものに対してチェックボックスを使用することがほとんどかと思いますが、1つのみの選択に絞りたいケースが発生することもあると思います。
その場合には、「QButtonGroup()」 を使用して対象のチェックボックスを1つのグループにまとめましょう。
【サンプルコード】
import sys
from PyQt6.QtWidgets import *
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("サンプルプログラム")
self.setGeometry(100, 100, 540, 380)
self.createCheckbox()
def createCheckbox(self):
# チェックボックスを配置
self.checkbox1 = QCheckBox(self)
self.checkbox1.setText("サンプルボックス1")
self.checkbox1.adjustSize()
self.checkbox1.move(200, 40)
self.checkbox2 = QCheckBox(self)
self.checkbox2.setText("サンプルボックス2")
self.checkbox2.adjustSize()
self.checkbox2.move(200, 80)
# チェックボックスをグループ化
self.group = QButtonGroup()
self.group.addButton(self.checkbox1, 1)
self.group.addButton(self.checkbox2, 2)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
生成した QButtonGroup に追加することで、同じグループのチェックボックスを同時に選択することが不可能になります。
まとめ
いかがでしたか?
今回紹介した機能はごく一部のみでしたが、普段よく見るウィンドウを比較的簡単に作成することができたかと思います。
他にも様々な機能が用意されていますので、ぜひ活用してみてくださいね。
Pythonの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、Pythonに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!

ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。