PythonでGUIライブラリはどれがおすすめ?
Pythonは、主に機械学習のイメージが強いですが、実際にはWebアプリケーションの作成、データのスクレイピング、GUIアプリケーションの作成など、様々なタスクを行うことができます。
これらのタスクを簡単かつ効率的に行うには、適切なライブラリが不可欠です。
今回は、Pythonを使ったGUIアプリケーションを作成する際におすすめのライブラリをご紹介します。
GUIとは
GUIは「Graphical User Interface」の略で視覚的に操作することが出来るUIのことです。
対して、CUI「Character User Interface」と呼ばれるものもあり、これは通常プログラミングを行う際に使用する、Macでいうターミナル、Windowsでいうコマンドプロントに相当します。
つまりあなたが日常的に使用しているデスクトップなども代表的なGUIであると言えるでしょう。
GUIを使うメリット
GUIを使うメリットとしては、見やすいということが挙げられます。
GUIが発明されるまで、基本的にコンピューターは全てCUIで操作されていました。しかしこの状態はエンジニアの方であれば非常に使いやすいですが、非エンジニアの方は非常に使いづらいです。
また、CUIでコンピューターを操作する場合には、複数のコマンドを入力する必要があります。
毎回不規則な値を入力して実行する必要があるプログラムがあるとしたら、実行時には都度引数を書き換えなければなりませんよね。
こういった手間を省くためにも、GUIアプリケーションを作成するのは非常にメリットが大きいのです。
PythonでGUIを作るためのライブラリ5種類の徹底比較
ここでは、GUIライブラリ5種類を比較していきます。それぞれ、どんな特徴があるのか具体的に見ていきましょう。今回はPython3系での動作をする前提で進めいきます。
Tkinter
「Tkinter」はPythonに標準的に組み込まれているGUIライブラリです。
標準ライブラリのため外部のライブラリを導入する必要がなく、Pythonの環境構築を行った時点で利用することができることが特徴です。またシンプルな文法と起動の速さが評価されており、Pythonにおけるもっとも基本的なGUIライブラリとしての立ち位置を築いています。
PySimpleGUI
「PySimpleGUI」は、Python用のシンプルなGUIライブラリです。
簡単なコードで美しいGUIアプリケーションを作成できます。PySimpleGUIは初心者から上級者までのユーザーを対象としていて、高い生産性と非常に簡単な学習曲線が特徴です。
またWindows、Mac、Linuxなどの多様なプラットフォームで利用可能で、様々な要素(ボタン、テキストボックス、スライダーなど)を組み合わせてアプリケーションを構築することができます。
Kivy
「Kivy」は、クロスプラットフォーム対応のPython用のGUIライブラリです。
iOS、Android、Linux、Windows、MacOSなどの多様なプラットフォームに対応しています。
独自のKV言語も採用しており、XMLのような形式でユーザインターフェースを記述することができます。このKV言語を使うことで、高速なアプリケーション開発が可能になります。
PyQt
「PyQt」は、Pythonを使ってGUIアプリケーションを作るためのフレームワークの1つです。
Qt(キュート)という「C++」言語で書かれたGUIフレームワークがあり、「PyQt」は「Qt」のPythonバージョンです。
多くのソフトが作られており、比較的モダンな設計と、GUIのデザインを美しく作りやすいことが評価されています。
wxPython
「wxPython」は「wxWidgets」という「C++」と書かれたクロスプラットフォームGUIツールキットがあり、「wxPython」はそのPythonバージョンです。
洗練されたAPIと豊富なライブラリが特徴であり、安定した動作が評価されています。
またライブラリの豊富さから、手の込んだものを作るのにも適しています。
Pythonの標準GUIライブラリ「Tkinter」で実際にGUIアプリを作ってみる
前項で紹介した通り、Pythonには様々なGUIライブラリが用意されています。
本項では紹介したGUIライブラリの中でもっとも基本的なGUIライブラリ「Tkinter」を使った、実際にGUIアプリのコードを解説します。
まずGUIの骨組みとして、ウィンドウが立ち上がるだけのコードを書いてみましょう。
ウィンドウが立ち上がるコードは以下の通りです。
# ウィンドウ立ち上げ
#--------------------------------
# Tkinterモジュールのインポート
import tkinter
# ウィンドウ(フレーム)の作成
root = tkinter.Tk()
# ウィンドウの名前を設定
root.title("demo_Tkinter")
# ウィンドウの大きさを設定
root.geometry("400x400")
# イベントループ(TK上のイベントを捕捉し、適切な処理を呼び出すイベントディスパッチャ)
root.mainloop()
tkinter.TK()メソッドを呼び出した段階で、ウィンドウが作成され表示されます。
上記コードでは表示されたウィンドウについて、名前をtitle()メソッドで指定し、ウィンドウの大きさをgeometry()メソッドで指定しています。
また、最後の行にあるmainloop()メソッドですが、これはイベントループと呼ばれるものであり、TkinterのGUI上で発生したイベント(ユーザがボタンをクリックした、等)を捕捉し、イベントに応じた適切な処理を呼び出す役割を担っています。
次に、ウィンドウに文字列(ラベル)を表示してみましょう。
# 文字列表示
#---------------------------------
import tkinter
root = tkinter.Tk()
root.title("demo_Tkinter")
root.geometry("400x400")
# ラベルの作成
label = tkinter.Label(root, text="This is the Label.")
#ラベルの表示
label.grid()
root.mainloop()
上記コード中に「ラベルの作成」とコメントした箇所がありますが、これがウィンドウ上に文字列(”This is the Label.”)を作成する処理です。
tkinte.Label()の第一引数にはrootを指定しており、キーワード引数textには文字列を指定しています。
これは「第一引数で指定したフレームに、キーワード引数textの文字列を作成する」という処理になっています。
フレームとはウィンドウの枠のことであり、上記コード中ではもっとも外側の枠となるウィンドウしか存在しませんが、これは入れ子上に作成・配置することができます。
フレームを入れ子構造にしたコードは以下の通りです。
# 入れ子構造
#--------------------------
import tkinter
# フレームその1(ウィンドウ・最上位フレーム)
frame1 = tkinter.Tk()
frame1.title("demo_Tkinter")
frame1.geometry("400x400")
# フレームその2(子フレーム・親にフレームその1を指定)
frame2 = tkinter.Frame(frame1)
# ラベルその1、その2(配置先:フレームその2(子フレーム))
label1 = tkinter.Label(frame2, text="This is the Label_1.")
label2 = tkinter.Label(frame2, text="This is the Label_2.")
# ラベルその3(配置先:フレームその1(ウィンドウ・最上位フレーム))
label3 = tkinter.Label(frame1, text="This is the Label_3.")
# ラベルその1、その2をフレームその2に表示
label1.pack(side=tkinter.LEFT)
label2.pack(side=tkinter.RIGHT)
# フレームその2をフレームその1に表示
frame2.grid()
# ラベルその3をフレームその1に表示
label3.grid()
frame1.mainloop()
上記コードで作成されたフレームとラベルの構成は次のようになっています。
・フレームその1
・フレームその2
・ラベルその1 + ラベルその2
・ラベルその3
フレームその2(子フレーム)を作成するとき、上記コード中で tkinter.Frame(frame1) と記述しました。このtkinter.Frame() の第一引数には、親フレームを指定することが出来ます。
今回は第一引数にフレームその1(ウィンドウ)を指定した為、フレームその2はフレームその1の子フレームとして作成されています。
また、ラベルやフレームを表示するときに、grid() や pack() といったメソッドを使用しています。これらのメソッドを使うことで初めて、事前に作成したラベルやフレームが実際にGUI上に表示されます。
GUI上に表示するためのメソッドは grid() と pack() の他に place() というメソッドも用意されており、これら表示メソッドごとの違いは次のようになっています。
- pack()
フレーム上に要素を一次元的に配置する(行のみ指定可能、指定しない場合は横1行ごとに要素を配置)。 - grid()
フレーム上に要素を二次元的に配置する(行と列を指定可能、指定しない場合は縦1列横1行ごとに要素を配置)。 - place()
フレーム上に座標を直接指定して、要素を配置する。
このように、GUIへの要素の表示方法にも複数の方法が用意されています。
また、ここまでの解説ではラベルを配置するのみのコードを紹介しましたが、Tkinterではその他にもチェックボックスやテキストフォーム、ボタンやステータスエリアなどを配置することが出来ます。
さらに、配置したボタンのクリックイベントを検出して、その際に自分で作成した関数を実行することもできます。
GUI上にボタンを配置して関数を実行するコードは次の通りです。
# 関数を紐づけたボタンを配置
#--------------------------
import tkinter
root = tkinter.Tk()
root.title('demo_Tkinter')
root.geometry("400x400")
# コンソールに"Button is clicked."を出力する関数
def clicked():
print("Button is clicked.")
# ボタンの作成(text=ボタンに表示されるテキスト, command=押下時に呼び出す関数)
button = tkinter.Button(root, text="ボタン", command=clicked)
# ボタンの表示
button.grid()
root.mainloop()
上記コード中の tkinter.Button()メソッドで、ボタンの作成と関数の紐づけを行っています。
tkinter.Button()メソッドのキーワード引数textにはボタンに表示する文言を指定でき、キーワード引数commandにはボタン押下時に呼び出される関数名を指定できます。
上記コード中でキーワード引数commandに指定した関数「clicked()」は、コンソールに"Button is clicked."を出力する関数として定義されています。
ですので表示されたGUI上のボタンを押下すると、その時点でclicked() が実行され、コンソールに "Button is clicked." が出力されます。
最後にこれらを合わせて簡単なTODOアプリを作成してみます。
# TODOアプリ
#--------------------------
import tkinter as tk
# Todoアプリのクラス
class TodoApp(tk.Tk):
def __init__(self):
super().__init__()
self.title("Todo App")
self.geometry("400x400")
# ラベルとエントリーを配置するフレーム
input_frame = tk.Frame(self)
input_frame.pack(pady=10)
tk.Label(input_frame, text="Task:").grid(row=0, column=0)
self.task_entry = tk.Entry(input_frame, width=30)
self.task_entry.grid(row=0, column=1)
# 追加ボタンを配置するフレーム
btn_frame = tk.Frame(self)
btn_frame.pack(pady=10)
tk.Button(btn_frame, text="Add Task", command=self.add_task).pack(side="left")
tk.Button(btn_frame, text="Delete Task", command=self.delete_task).pack(side="left")
# タスクの一覧を表示するリストボックス
self.task_list = tk.Listbox(self, selectmode="multiple", bd=10)
self.task_list.pack(fill="both", expand=True)
# タスクの一覧
self.tasks = []
# タスクの追加
def add_task(self):
task = self.task_entry.get()
if task:
self.tasks.append(task)
self.task_list.insert("end", task)
self.task_entry.delete(0, "end")
# タスクの削除
def delete_task(self):
selected_indices = self.task_list.curselection()
for index in selected_indices[::-1]:
self.task_list.delete(index)
self.tasks.pop(index)
# Todoアプリを起動する
if __name__ == "__main__":
app = TodoApp()
app.mainloop()
このようにPython標準GUIライブラリTkinterを使うことで、GUIアプリを作成可能です。
ここで紹介したのはシンプルなラベルやボタンの配置のみでしたが、Tkinterにはまだまだ他にもたくさんの機能が用意されています。
興味のある方はぜひ調べてみてください。
まとめ
今回は、PythonでGUIアプリケーションを作る時のおすすめのライブラリの紹介と、そのうちのひとつであるTkinterを使用したGUIアプリのコードについての解説を行いました。
GUIアプリを制作できると、Pythonで制作したツール等をプログラミング言語について詳しくない方などに簡単に共有できるようになります。
ぜひ積極的に活用して、色々なツール等をGUIアプリとして実装できるようになりましょう。
##この記事のキーワードに関する勉強会・イベントを探す
TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。