PythonでGUIライブラリはどれがおすすめ?

プログラミング
Python 学習初心者の方で、GUIアプリケーションを作る時にオススメのライブラリ4つをご紹介しています。今回は、Kivy、Tkinter、PyQt、wxPythonをご紹介していますが、PythonでGUIライブラリには、それぞれ特徴があるので注意が必要です。
PythonでGUIライブラリはどれがおすすめ?

「Python=機会学習」のイメージが強いですが、他にもWebアプリを作れたり、データのスクレイピングができるだけなく、GUIアプリケーションを作ることが出来るという特徴があります。
PythonでGUIを作るためにほとんどの人が必要なのがライブラリ。
今回は、Pythonを使ってGUIアプリケーションを作る時におすすめのライブラリをご紹介していきます。

GUIとは

GUIとは、「Graphical User Interface」のことで視覚的に操作することが出来るUIのことです。
それに対して、CUI「Character User Interface」と呼ばれるものがあり、これはあなたが普段プログラムを書く時に使っている、Macでいうターミナル、Windowsでいうコマンドプロントに相応します。
つまりあなたが普段使っているデスクトップなども代表的なGUIであると言えるでしょう。

GUIを使うメリット

GUIを使うメリットとしては、見やすいということが挙げられます。

GUIが発明されるまで、基本的にコンピューターは全てCUIで操作されていました。しかしこの状態はエンジニアの方であれば非常に使いやすいですが、非エンジニアの方は非常に使いづらいですよね。
また、CUIでコンピューターを操作する場合には、何回もコマンドを打たなければ操作することができません。

毎回不規則な値を入れて何回も実行しなければならないプログラミングがあるとしたら、毎回その値の引数を書き換えて実行しなければなりませんよね。
こういった手間を省くためにも、GUIアプリケーションを作るのは非常にメリットが大きいのです。

PythonでGUIを作るためのライブラリ4種類の徹底比較

ここでは、GUIライブラリ4種類を比較していきます。それぞれ、どんな特徴があるのか具体的に見ていきましょう。今回はPython3系での動作をする前提で進めいきます。

Tkinter

「Tkinter」はPythonに標準的に組み込まれているGUIライブラリです。
標準ライブラリのため外部のライブラリを導入する必要がなく、Pythonの環境構築を行った時点で利用することができることが特徴です。シンプルな文法と起動の速さが評価されており、Pythonにおけるもっとも基本的なGUIライブラリとしての立ち位置を築いています。

Kivy

近年、PythonのGUIライブラリの中でもっとも人気が高いものが「Kivy」です。
Kivyは、PythonでGUIのプログラムを作るためのオープンソースのライブラリで、Android、iOS、Linux、MacOS、Windowsなどの多くのOSで動作するため、汎用的に利用することが可能です。 KV言語というGUIのレイアウトを作成する言語が用意されており、直感的な記法で簡単にレイアウトを指定できるのが特徴です。

PyQt

「PyQt」は、Pythonを使ってGUIアプリケーションを作るためのフレームワークの1つです。
Qt(キュート)という「C++」言語で書かれたGUIフレームワークがあり、「PyQt」は「Qt」のPythonバージョンです。 多くのソフトが作られており、比較的モダンな設計と、GUIのデザインを美しく作りやすいことが評価されています。

wxPython

「wxPython」は「wxWidgets」という「C++」と書かれたクロスプラットフォームGUIツールキットがあり、wxPythonはそのPythonバージョンです。
wxPythonは洗練された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." が出力されます。

このようにPython標準GUIライブラリTkinterを使うことで、GUIアプリを作成可能です。
ここで紹介したのはシンプルなラベルやボタンの配置のみでしたが、Tkinterにはまだまだ他にもたくさんの機能が用意されています。
興味のある方はぜひ調べてみてください。

まとめ

今回は、PythonでGUIアプリケーションを作る時のおすすめのライブラリの紹介と、そのうちのひとつであるTkinterを使用したGUIアプリのコードについての解説を行いました。
GUIアプリを制作できると、Pythonで制作したツール等をプログラミング言語について詳しくない方などに簡単に共有できるようになります。
ぜひ積極的に活用して、色々なツール等をGUIアプリとして実装できるようになりましょう。


この記事のキーワードに関する勉強会・イベントを探す

TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。


おすすめのコラム