Pythonには、標準でWindows/macOS/Linuxのデスクトップ向けアプリを作成するTkinterというライブラリが備わっている。このライブラリを使うと、ボタンやエディタなどGUIを持つアプリを作ることができる。今回は、デスクトップアプリの開発方法を紹介する。作成例として、肥満度判定を行うBMI計算ツールを作ってみよう。ここで作成するのは身長と体重を入力すると、BMI値と肥満度を表示するツールだ。

  • 肥満度計算を行うデスクトップアプリを作ってみよう|

    肥満度計算を行うデスクトップアプリを作ってみよう

デスクトップアプリとは?

ところで、『デスクトップアプリ』とは何だろうか。WindowsやmacOSなどパソコン上で動作するアプリのことだ。昨今、アプリと言えば、スマートフォンを対象にしたアプリを指すことが増えた。そこで、スマホアプリに対して、パソコンで動作するアプリを、『デスクトップアプリ』と呼ぶ。

Pythonでデスクトップアプリを作成するには、いくつかライブラリがある。Pythonに標準的に同梱されている『Tkinter』、クロスプラットフォーム対応で人気がある『Kivy』、wxWidgetsというツールキットを利用した『wxPython』、Qtというツールキットを利用した『PyQt』などです。ここでは、手軽に扱えるライブラリ『Tkinter』の使い方を紹介しよう。

Tkinterが使えるか確認してみよう

なお、『Tkinter』は、Python標準付属のライブラリであるが、内部的には『Tcl/Tk』というGUIライブラリを利用しており、Tkinterを使うにはTcl/Tkが必要になる。しかし、Pythonをインストールすると、最初からTcl/Tkのライブラリもインストールされるはずだ。

とはいえ、インストールの際に何かしらの理由でTck/Tkが入っていないという可能性もあるので、動くかどうかを確認してみよう。

本連載ではPythonのディストリビューションの一つ『Anaconda』がインストールされていることを念頭に置いている。インストールしていない人は、こちらを参考にインストールしよう。

Windowsでは、Windowsメニューから[Anaconda3 > Anaconda Prompt]を起動しよう。macOSではターミナル.appを起動しよう。そして、以下のコマンドを実行してみよう。

python -m tkinter

正しくインストールが行われている場合、以下のように、Tcl/Tkのウィンドウが表示される。

  • Tkinterモジュールの動作テスト - Windows|

    Tkinterモジュールの動作テスト - Windows

Pythonは、Windows/macOS/Linuxに対応しているが、Tkinterを使ったプログラムはだいたい同じように動かすことができる。

ただし、macOSでこのテストプログラムを実行したところ、ボタンの文字が切れてしまっていた。マウスでウィンドウを大きく調整することで、Windowsで実行するのと同じように表示された。複数OSに対応する場合は、レイアウトに余裕を持たせる必要があるだろう。

  • Tkinterモジュールの動作テスト - macOS

    Tkinterモジュールの動作テスト - macOS

また、もし、エラーが出てウィンドウが出ない場合には、Tcl/Tkがインストールされていない場合がある。Pythonのインストールをやり直すか、ActiveStateからダウンロードできる。

一番簡単なTkinterのプログラム

それでは、一番簡単なTkinterのプログラムを作ってみよう。以下は、Tkinterのウィンドウを表示するだけの極めて基本的なプログラムだ。

# Tkinterのライブラリを取り込む --- (*1)
import tkinter as tk

# ウィンドウを作成 --- (*2)
win = tk.Tk()
win.title("Hello, World!") # タイトル
win.geometry("400x300") # サイズ

# ウィンドウを動かす --- (*3)
win.mainloop()

上記のプログラムを「hello_tk.py」という名前で保存しよう。そして、コマンドラインから以下のコマンドを実行すると、次のように「Hello, World!」というタイトルのウィンドウが表示される。

  • Tkinterで一番簡単なプログラム

    Tkinterで一番簡単なプログラム

プログラムを確認してみよう。(*1)ではtkinterのライブラリを取り込む。Python3.xでは「tkinter」と全部小文字で書くのが正式なライブラリ名だ。Python2では「Tkinter」と一文字目だけ大文字だった。ネット上にあるTkinterの資料の中には、Python2のもので古い資料であることが多いので注意しよう。

プログラムの(*2)の部分では、ウィンドウを作成しタイトルとサイズを指定している。そして、(*3)の部分では、ウィンドウがマウス操作などに対応できるよう、メインループを実行する。Tkinterを利用したデスクトップアプリでは、この一行が重要になる。書き忘れないようにしよう。

ラベルとテキストボックスとボタンを使ってみよう

ウィンドウを利用するプログラムでは、テキストボックスやラベルをウィンドウ上に配置することで、プログラムの見た目を構成していく。

以下は、ラベル(Label)とテキストボックス(Entry)とボタン(Button)を活用する例だ。

テキストボックスに名前を書き込んでOKボタンを押すと、名前入りの挨拶を表示するという簡単なプログラムを作ってみよう。以下のプログラムを「gui.py」という名前で保存しよう。

import tkinter as tk
from tkinter import messagebox as mbox

# ウィンドウを作成 --- (*1)
win = tk.Tk()
win.geometry("500x250") # サイズを指定

# 部品を作成 --- (*2)
# ラベルを作成
label = tk.Label(win, text='名前は?')
label.pack()

# テキストボックスを作成
text = tk.Entry(win)
text.pack()
text.insert(tk.END, 'クジラ') # 初期値を指定

# OKボタンを押した時 --- (*3)
def ok_click():
    # テキストボックスの内容を得る
    s = text.get()
    # ダイアログを表示
    mbox.showinfo('挨拶', s + 'さん、こんにちは!')

# ボタンを作成 --- (*4)
okButton = tk.Button(win, text='OK', command=ok_click)
okButton.pack()

# ウィンドウを動かす
win.mainloop()

コマンドラインで「python gui.py」を実行すると、以下の表にプログラムが実行される。

  • ウィンドウ上にラベルやテキストボックスを配置する例

    ウィンドウ上にラベルやテキストボックスを配置する例

プログラムを確認してみよう。(*1)の部分では、ウィンドウを作成する。

そして、(*2)の部分では、ラベルやテキストボックスを作成する。tk.Label(...)や、tk.Buttonと書くとラベルやボタンなどの部品が作成される。そして、pack()と記述すると、作成した部品をウィンドウ上に配置することができる。

(*3)ではボタンを押した時の処理を記述している。ここでは、(*2)で作成したテキストボックスの内容を取得して、メッセージボックスに「**さん、こんにちは!」のように表示するようにしている。

最後(*4)の部分では、ボタンを作成しウィンドウにボタンを配置する。また、クリックした時に、ok_click関数が実行されるように指定した。

このように、ウィンドウを使ったプログラムでは、実直に処理が上から下に流れるのではなく、ボタンを押したらどうなる、キーボードを押したどうなる、という流れでプログラムを構築していく。通常のプログラムよりも複雑になりがちなので、整理して記述する習慣をつけておこう。

肥満度判定プログラムを作ろう

それでは、基本的なTkinterの使い方が分かったところで肥満度判定プログラムを作ってみよう。

import tkinter as tk

# ボタンを押したときの処理 --- (*1)
def calc_bmi():
    # BMIを計算
    h = float(textHeight.get()) / 100
    w = float(textWeight.get())
    bmi = w / h ** 2
    rw = h ** 2 * 22
    per = int(w / rw * 100) - 100
    # 結果をラベルに表示
    s = "肥満 {0}% (bmi={1})".format(per, bmi)
    labelResult['text'] = s

# ウィンドウを作成 --- (*2)
win = tk.Tk()
win.title("肥満判定")
win.geometry("500x250")

# 部品を作成 --- (*3)
labelHeight = tk.Label(win, text=u'身長(cm):')
labelHeight.pack()

textHeight = tk.Entry(win)
textHeight.insert(tk.END, '160')
textHeight.pack()

labelWeight = tk.Label(win, text=u'体重(kg):')
labelWeight.pack()

textWeight = tk.Entry(win)
textWeight.insert(tk.END, '70')
textWeight.pack()

labelResult = tk.Label(win, text=u'---')
labelResult.pack()

calcButton = tk.Button(win, text=u'計算')
calcButton["command"] = calc_bmi
calcButton.pack()

# ウィンドウを動かす
win.mainloop()

プログラムを実行するには、コマンドラインで「python bmi.py」と実行しよう。以下のようにプログラムが実行される。そこで、身長と体重を書き込んで「計算」ボタンをクリックすると、肥満度とBMIの値が表示される。

  • 肥満度判定プログラム

    肥満度判定プログラム

  • OKボタンを押すと結果が表示される

    OKボタンを押すと結果が表示される

プログラムを確認してみよう。プログラムの(*1)の部分で、計算ボタンを押した時の処理を記述している。ここでは、テキストボックスに入力した身長と体重の値を取得しBMIを計算する。そして、計算結果をラベルに表示する。

そして、(*2)の部分ではウィンドウを作成し、(*3)では部品を作成し、ウィンドウ上に配置する。ここでは、身長と体重について、それぞれラベルとテキストボックスを作成し、さらに、結果を表示するラベルと計算ボタンを作成する。そして、計算ボタンがクリックしたら、calc_bmiを呼び出すように指定した。

まとめ

以上、今回はTkinterを利用して、デスクトップアプリを使う方法を紹介した。ここで紹介したように、Pythonを使えば、ボタンやテキストボックスを利用するデスクトップアプリが簡単に作成できる。ちょっとした自分ツール作成に便利だ。見積もりツールや定型処理を実行するランチャーなど、アイデア次第でいろいろ作ることができるだろう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。