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幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。