GUIは、ボタン・リスト・テキストボックスなど使用して、マウスやタッチスクリーンで操作するソフトウェアの入力形式です。
直感的で初心者にも使いやすく、現在ではWindowsやMacなどのOSで広く採用されています。(広い意味ではスマートフォンもGUIです。)
2014年 大学在学中にソフトウェア開発企業を設立
2016年 新卒でリクルートに入社 SUUMOの開発担当
2017年 開発会社Jiteraを設立
開発AIエージェント「JITERA」を開発
2024年 「Forbes 30 Under 30 Asia 2024」に選出
アプリ・システム開発は生成AIを活用することで、従来の開発ではあり得なかった、低コスト・高品質開発・スピード開発が同時に実現できます。
▼従来の開発とAIを使った開発の違い
システムソリューションを得意とし、新規事業からDX推進まで幅広いジャンルの開発実績があります。
PythonのGUIとは?入門知識
実際のGUIプログラミングにおいては、0からボタン・ドロップボックス・リスト・テキストボックスなどをプログラミングで作成するとなると大変な労力と手間がかかってしまいます。
例えばCやC++などでWINDOWSのプログラミングでGUIを構築しようとするとOSのAPIを知識として知っていて、そのAPIを使ってどんなプログラミングをして動かすかを考えないといけません。
そこで、ボタン・ドロップボックスなどを簡単に作れるように、すでにつくられているプログラミングの部品や、フレームワークを使います。これをライブラリといいます。
PythonにはGUI用のライブラリがたくさんあり、自分の用途によって選択することができます。
おすすめのPython GUIフレームワーク・ライブラリ
それではどのようなライブラリやフレームワークがあるのか、詳しく紹介していきます。
ライブラリ | 特徴 | ライセンス |
Tkinter | Tcl/TkのPythonバインディングで、Pythonの標準ライブラリで提供 追加のインストールが不要 |
Python標準 |
Kivy | tkinterと比較して見た目がモダン スマホアプリにも対応 商用利用しやすい |
MITライセンス |
PyQt | QtのPythonバインディング 豊富なウィジェットと機能が充実 商用ライセンスなしの商用利用は、ソース公開が義務づけられている |
GPL(PyQt5) ※商用ライセンスもあり |
wxPython | wxWidgetsのPythonバインディング 高速で機能が豊富 OSと調和したGUIが作成可能 |
wxWindows License |
PySimpleGUI | 簡単にGUIが作成可能 | 有償ライセンス |
※バインディングとはCやC++で作成されたコード
※Tcl/Tkは、スクリプト言語TclとGUIツールキットTkからなる 非常に強力なGUIスクリプティング環境
Tkinter
参照:Tkinter
TkinterはPythonの標準ライブラリにすでにあり、特別なインストールがいりません。Tcl/TkのPythonバインディングです。
以下は、Tkinterで利用できるパーツの一部となります。
- ボタン (button)
- ラベル (label)
- テキストボックス (entry)
以下にボタンを作って、使用する例を紹介します。
import tkinter as tk
def on_button_click():
print(“ボタンがクリックされました!”)
root = tk.Tk()
root.title(“Tkinter ボタンの例”)
# ボタンを作成
button = tk.Button(root, text=”クリックしてください”,
command=on_button_click)
button.pack()
root.mainloop()
この例では、「tk.Button」を使ってボタンを作成しています。ボタンをクリックすると、「on_button_click関数」が実行されます。ボタンのテキストはtextオプションで指定できます。詳細なオプションについては、Tkinterの公式ドキュメントを参照してください。このコードを実行すると、ウィンドウが表示され、ボタンをクリックするとメッセージが表示されるはずです。
PyQt
参照:pyQt
PyQtは、PythonでクロスプラットフォームのGUIアプリケーションを作成するためのライブラリです。これは、C++で書かれたQtフレームワークのPythonバインディングであり、強力で柔軟なGUI構築が可能です。
PyQtは、ウィジェットやイベント処理、データベース接続、ネットワーキングなど多くの機能を提供します。PyQt5やPyQt6などのバージョンがあり、Pythonコードから直接Qtの豊富な機能にアクセスできます。
以下は、簡単なPyQt5を使ったウィンドウ表示の例です。
import sys
from PyQt5.QtWidgets import QApplication, QWidget
# アプリケーションオブジェクトの作成
app = QApplication(sys.argv)
# ウィジェットの作成
window = QWidget()
window.setWindowTitle(‘PyQt5 ウィンドウ’)
window.setGeometry(100, 100, 280, 80)
# ウィンドウの表示
window.show()
# イベントループの開始
sys.exit(app.exec_())
このコードは、シンプルなウィンドウを表示する最小限の例です。`QApplication`オブジェクトがアプリケーション全体を管理し、`QWidget`が基本的なウィンドウを提供します。`show()`メソッドでウィンドウを表示し、`exec_()`メソッドでイベントループを開始します。
Kivy
Kivyは、Pythonでモバイルおよびデスクトップアプリケーションを開発するためのオープンソースライブラリです。マルチタッチやマルチメディアアプリケーションの開発に適しており、クロスプラットフォーム対応(Windows、macOS、Linux、iOS、Android)です。Kivyは、柔軟なレイアウトやウィジェット、グラフィックスエンジンを提供し、簡単に使える直感的なAPIを備えています。
以下は、Kivyを使った簡単なアプリケーションの例です。
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
return Label(text=’Hello, Kivy!’)
if __name__ == ‘__main__’:
MyApp().run()
このコードは、シンプルなKivyアプリケーションを作成します。`App`クラスを継承した`MyApp`クラスを定義し、`build`メソッドで`Label`ウィジェットを返します。`Label`は、画面にテキストを表示するためのウィジェットです。`MyApp().run()`でアプリケーションを起動し、ウィンドウが表示されます。このようにして、Kivyを使って簡単にアプリケーションを作成できます。
PySimpleGUI
参照:PyslmpleGUI
ドキュメント:ドキュメント
PySimpleGUIは、PythonでGUIアプリケーションを簡単に作成するためのライブラリです。Tkinter、Qt、WxPython、Remiなどの既存のGUIフレームワークの上にラッパーを提供し、シンプルなAPIで複雑なインターフェースを迅速に構築できます。コードの行数を減らし、GUIの開発を効率化するために設計されています。
以下は、PySimpleGUIを使った基本的なウィンドウの例です。
import PySimpleGUI as sg
# レイアウトの定義
layout = [[sg.Text(‘Hello, PySimpleGUI!’)],
[sg.Button(‘OK’)]]
# ウィンドウの作成
window = sg.Window(‘Simple Window’, layout)
# イベントループ
while True:
event, values = window.read()
if event == sg.WIN_CLOSED or event == ‘OK’:
break
# ウィンドウの終了処理
window.close()
このコードは、”Hello, PySimpleGUI!”というテキストと”OK”ボタンを持つシンプルなウィンドウを表示します。`layout`でウィジェットの配置を定義し、`sg.Window`でウィンドウを作成します。`window.read()`でイベントを監視し、”OK”ボタンが押されるかウィンドウが閉じられるとループを終了します。
wxPython
wxPythonは、PythonでクロスプラットフォームのGUIアプリケーションを作成するためのライブラリです。これは、C++で書かれたwxWidgetsライブラリのPythonバインディングであり、Windows、macOS、Linux上でネイティブな外観と操作感を提供します。wxPythonは、豊富なウィジェットと柔軟なレイアウト管理を備えており、複雑なデスクトップアプリケーションの構築が可能です。
以下は、wxPythonを使った基本的なウィンドウの例です。
import wx
# アプリケーションオブジェクトの作成
app = wx.App(False)
# フレームの作成
frame = wx.Frame(None, wx.ID_ANY, “Hello wxPython”)
panel = wx.Panel(frame, wx.ID_ANY)
text = wx.StaticText(panel, label=”Hello, wxPython!”, pos=(10, 10))
# フレームの表示
frame.Show(True)
# イベントループの開始
app.MainLoop()
このコードは、”Hello, wxPython”というタイトルのウィンドウを表示します。`wx.App`オブジェクトを作成してアプリケーションを初期化し、`wx.Frame`でメインウィンドウを作成します。`wx.Panel`上に`wx.StaticText`ウィジェットを配置してテキストを表示します。`frame.Show(True)`でウィンドウを表示し、`app.MainLoop()`でイベントループを開始します。
Python GUIアプリ開発方法
PythonのGUIアプリの計画から公開までのステップを紹介します。以下、詳細に説明します。
要件定義
GUIアプリケーションの要求定義は、以下のポイントを決定します。
目的と概要
GUIアプリケーションの目的と概要を明確に定義します。
機能要件
アプリケーションが提供する機能をリストアップします。
ユーザーインターフェース (UI)
UIの要件を記述します。どのウィジェットを配置するか、どのようなレイアウトを使用するかなどを明確にします。
動作要件
アプリケーションの動作に関する要件を定義します。
非機能要件
パフォーマンス、セキュリティ、ユーザビリティなどの非機能要件を考慮します。
アプリの設計
設計は以下の工程を行います。
レイアウト設計
選定したライブラリに基づき、各画面のレイアウトを詳細に設計します。例:メインウィンドウ、設定画面、ダイアログボックス。
コンポーネント設計
ウィジェットやコントロール(ボタン、ラベル、入力フィールドなど)をどのように配置するかを決定します。
データフロー設計
データの流れを設計します。例:ユーザー入力→バリデーション→データベース保存。
オブジェクト指向で開発する場合は、クラスの設計も必要です。
ツールとライブラリの選択
PythonでGUIアプリを開発する際のツールとライブラリ選びは重要です。以下にライブラリの適用例を紹介します。
Tkinter
小規模なデスクトップアプリケーションです。
PyQt
複雑なデスクトップアプリケーションです。
Kivy
モバイルアプリ、マルチメディアアプリです。
wxPython
クロスプラットフォームデスクトップアプリです。
PySimpleGUI
迅速なプロトタイピングを特徴に持つ、小規模アプリです。
選択するライブラリは、プロジェクトの要件や開発者のスキルレベルに応じて決めます。
アプリのテストとデバッグ
テストとデバッグは、以下のステップで進めます。
1.単体テスト
ツールの[unittest]や[pytest]を使用し、各機能やモジュールを個別にテストします。GUI部分はモックやスタブを使ってテスト可能です。
例: ボタンのクリックイベントが正しく動作するか確認。
2.統合テスト
モジュール間の連携をテストします。システム全体が期待通りに動くか確認します。
3.ユーザビリティテスト
アプリを実際に使用してもらい、使いやすさや直感的な操作性を評価します。
4.デバッグ
ログファイルにエラーメッセージやデバッグ情報を記録し、問題の発生箇所を特定します。`logging`モジュールを活用します。また、IDEのデバッガ(PyCharm、VSCodeなど)を使ってブレークポイントを設定し、コードの実行を逐次確認します。
5.自動化テスト
ツールの[Selenium]や[PyAutoGUI]を使用して、UIの自動化テストを行い、操作のシミュレーションをします。
これらの手法を組み合わせることで、GUIアプリの品質を確保します。もし製品としてリリースするには、この後にドキュメント作成・パッケージング・配布が必要です。
PythonでのGUIアプリ開発でのよくあるトラブル
PythonでのGUIアプリ開発では、互換性や.パフォーマンス、イベントハンドリングのバグなどのトラブルがよく発生します。
ここでは、よくあるトラブルとその対処方法を紹介します。
レイアウト崩れ
PythonでのGUI開発では、レイアウト崩れがよく発生するトラブルの一つです。以下に主な原因と対策を説明します。
ウィジェットのサイズと位置の設定ミス
ウィジェットの固定サイズや位置をハードコーディングすると、異なる画面サイズや解像度で崩れることがあります。
レスポンシブデザインを採用し、レイアウトマネージャ(例:【Tkinter】の「pack」や「grid」、【PyQt】の「QVBoxLayout」や`QHBoxLayout`)を使用する。
ウィジェットの競合によって崩れる
複数のウィジェットが同じスペースを要求することでレイアウトが乱れることがあります。各ウィジェットに適切なスペースを割り当て、重ならないように配置します。マージンやパディングを調整することも有効です。
動的コンテンツのサイズ変更による崩れ
ユーザー入力や動的に変わるコンテンツがウィジェットのサイズを変化させ、レイアウトを崩すことがあります。ウィジェットのサイズを自動調整する設定(例:「expand」、「fill」)を使い、動的な変化に対応します。
クロスプラットフォームの違いで崩れる
各プラットフォーム(Windows、macOS、Linux)でウィジェットの表示やフォントが異なるため、レイアウトが崩れることがあります。各プラットフォームでテストを行い、互換性のある設定を適用します。
イベント処理の不具合
PythonのGUI開発で、イベント処理の不具合は一般的なトラブルです。以下に主な原因と対策を説明します。
イベントバインディングのミス
イベントが正しくバインドされていない、またはバインドするウィジェットを間違えている場合に起こります。イベントバインディングのコードを確認し、正しいウィジェットとイベントハンドラを使用しているかチェックします。
イベントループのブロッキング長時間実行される
処理がメインイベントループをブロックし、GUIがフリーズする現象です。スレッドや非同期処理(例:`threading`モジュールや`asyncio`)を使用して、メインイベントループをブロックしないようにします。
イベントハンドラのエラーイベント
ハンドラ内のコードにバグがあり、例外が発生してイベントが正常に処理されない現象です。イベントハンドラ内のコードをデバッグし、例外処理を適切に行います。ログを活用してエラーの詳細を記録します。
複数のイベント処理
複数のイベントが同時に発生し、競合する現象です。イベントの優先順位を設定し、必要に応じてイベントをキューに入れて順次処理します。
アプリの動作が遅い
PythonのGUIアプリケーションで動作が遅くなる問題はよく発生します。以下に主な原因と対策を説明します。
非効率なコード
計算量の多い処理やループがメインスレッドで実行され、GUIの応答性が低下する現象です。計算やデータ処理を最適化し、効率的なアルゴリズムを使用し、不要な処理や冗長なコードを削減することで解消されます。
ブロッキングI/O
ファイル操作やネットワーク通信がメインスレッドで行われ、GUIがフリーズするトラブルです。スレッドや非同期処理(例:`threading`や`asyncio`モジュール)を利用して、I/O操作を別スレッドで実行しましょう。
大量のウィジェット
一度に大量のウィジェットを生成・更新することで、描画に時間がかかる現象です。必要なウィジェットのみを表示し、不要なウィジェットは非表示または削除します。ウィジェットの更新を最小限に抑えましょう。
メモリ管理の問題
メモリリークや過剰なメモリ使用が原因で動作が遅くなるトラブルです。メモリプロファイリングツールを使用してメモリ使用状況を監視し、リークを修正し解消できます。
アプリがクラッシュする
PythonのGUIアプリ開発でアプリがクラッシュする問題は深刻です。以下に主な原因と対策を説明します。
未処理の例外
コード内のバグやエッジケースで例外が発生し、適切に処理されないままアプリがクラッシュする現象です。例外処理を徹底し、try-exceptブロックを適切に配置してエラーをキャッチし、ログに記録しましょう。
リソースの不足
メモリやファイルハンドルなどのリソースが枯渇し、アプリがクラッシュするトラブルです。メモリ使用量を監視し、不要なリソースを適時解放する。ファイルやネットワーク接続は適切にクローズしましょう。
不正なウィジェット操作
存在しないウィジェットにアクセスする、または破棄されたウィジェットを操作することでエラーが発生するトラブルです。ウィジェットの有無を確認してから操作し、ウィジェットのライフサイクルを適切に管理しましょう。
外部ライブラリの不具合
使用しているライブラリにバグがあり、アプリがクラッシュするトラブルです。ライブラリを最新バージョンに更新し、既知のバグや問題点をチェックします。必要に応じて代替ライブラリを検討しましょう。
アプリがマルチプラットフォームで動作しない
Pythonでマルチプラットフォームで動作しないGUIアプリのトラブルにはいくつかの原因が考えられます。
ライブラリの選択
ライブラリの選択が誤っていることが原因です。Tkinter、WxPython、Qtなどプロジェクトに適したライブラリを選択してください。
依存関係
依存関係を考慮しないとアプリがプラットフォームで動作しないことがあります。パッケージ化された実行可能ファイルに必要なライブラリを含めてください。
プラットフォーム固有の問題
プラットフォームそのものに問題がある場合も考えられます。異なるオペレーティングシステムでテストし、互換性の問題を特定してください。
PythonとGUIを学習できる本・書籍
Pythonは比較的に取得しやすいプログラム言語です。文法がわかりやすく順次処理ができますし、開発環境が構築しやすくスクリプト言語なのですぐに実行できて、結果もすぐにわかりやすいです。一方でPythonのGUIもライブラリをつかうことができて簡単に作ってみることができます。
ここではおすすめの書籍を紹介します。
Pythonをおぼえた人がGUIアプリケーション開発をするためのtkinter速習入門
参照:Pythonをおぼえた人がGUIアプリケーション開発をするためのtkinter速習入門
『Pythonをおぼえた人がGUIアプリケーション開発をするためのtkinter速習入門』は、Pythonの基礎を持つ方向けの速習書です。tkinterを使ってクロスプラットフォームなGUIアプリケーションを作成する方法をわかりやすく解説しています。本書は初学者にも適しており、シンプルなウィジェットから始めて徐々にステップアップできる内容です。
PythonでGUIをつくろう─はじめてのQt for Python
参照:PythonでGUIをつくろう─はじめてのQt for Python
『PythonでGUIをつくろう─はじめてのQt for Python』は、Pythonの基礎を持つ方向けの速習書です。Qt for PythonとQt Quickを使用したUIの基本的な作成方法を解説しています。もしGUIアプリケーション開発に興味がある方は、ぜひ一読してみてください
逆引きPython標準ライブラリ 目的別の基本レシピ180+! impress top gearシリーズ
参照:逆引きPython標準ライブラリ 目的別の基本レシピ180+! impress top gearシリーズ kindle版
『逆引きPython標準ライブラリ 目的別の基本レシピ180+!』は、Pythonの基本的な文法を理解したユーザー向けの速習書です。Python標準ライブラリの活用術を目的別に180以上の基本レシピで解説しており、文字列操作、データ処理、ファイル操作、数値演算、ネットワークアクセス、GUIなどのテクニックを満載しています。
まとめ:PythonでのGUIアプリ開発は強力なツール
Pythonを使ってのGUI開発は、ライブラリを使って比較的に簡単なプログラミングでかっこいいGUIのアプリをつくることができます。
PythonのGUI開発用のライブラリは有名なものから、無名のものまで数多くあり、用途にあわせて選ぶことができます。記事の中では有名なライブラリの特徴や、サンプルのコードも紹介しています。
Pythonは比較的に自己学習しやすいプログラム言語なので、GUI開発の場合にも書籍を読んで覚えることができます。そのためお勧めの書籍を紹介しています。
Jiteraでは、要件定義を書くだけでAIが開発支援をしてくれるツールで、アプリ・システム開発を行っています。制作している途中で要件が変更になっても柔軟に修正しながら開発できるので、アプリ開発・システム開発のご相談、またPythonのGUI開発についての簡単な疑問があればお気軽にご相談ください。