GUIに挑戦してみよう

基礎編での文法や構文に関する説明は前回で終わりです。ここからはいくつかのPythonのライブラリを使ってコードを動かしてます。少し長めのコードが多いですが細かいことにこだわらず、コピーペーストで動かしてみて雰囲気を掴みましょう。

簡単なGUI

Pythonの標準ライブラリにはGUIを作成するtkinterというモジュールが含まれています。以下のコードをコピー&ペーストして実行してみてください。

import tkinter as tk

root = tk.Tk()
my_label = tk.Label(text="Tkinter Sample")
my_label.pack()
root.mainloop()

以下のようなウィンドウが表示されます。

最大化、最小化、ドラッグアンドドロップによるウィンドウサイズの変更、ウィンドウを閉じるといった最低限の操作が可能です。Pythonで複雑なGUIアプリを作成することは難しいのですが、簡単なものであればtkinterで作成することが可能です。

BMI計算ツール

tk.Tk()でウィンドウを構成するオブジェクトが生成されます。また、tk.Labelを使用するとラベルを表示することができます。

それ以外にもtk.Entryで入力欄、tk.Buttonでボタンを使用することができます。また、tk.StringVarで画面上の出力を変えることもできます。これらを使用してもう少し複雑なサンプル、BMI計算ツールを作ってみましょう。BMIの計算式はBMI(kg/㎡)= 体重(kg) ÷ 身長(m) ÷ 身長(m)で与えられます。

import tkinter as tk

root = tk.Tk()
root.title("BMI計算ツール")
root.geometry('250x150')

# 体重入力欄
weight_label = tk.Label(text="体重")
weight_label.pack()
weight_entry = tk.Entry(justify='right')
weight_entry.pack()

# 身長入力欄
height_label = tk.Label(text="身長")
height_label.pack()
height_entry = tk.Entry(justify='right')
height_entry.pack()

# 計算結果
bmi_label = tk.Label(text="BMI計算結果")
bmi_label.pack()

bmi_result = tk.StringVar()
bmi_label = tk.Label(text="", textvariable=bmi_result)
bmi_label.pack()


def calc_bmi():
    """ BMI 計算 """
    weight = int(weight_entry.get())
    height = int(height_entry.get()) / 100
    bmi = weight / (height * height)

    global bmi_result
    bmi_result.set(str(bmi))


# 計算ボタン
button = tk.Button(text="計算", command=calc_bmi)
button.pack()

# メインループ開始
root.mainloop()

実行すると以下のような画面が立ち上がり、BMIの計算ができるようになります。

今回は雰囲気を掴むためのプログラミングなので細かい解説は割愛しますが、Pythonの学習を続けるとコードが理解できるようになるはずです。

ところで、プログラミング上達のコツとして、既存のコードを自分で改変してみる、というものが挙げられます。頭の体操がてら次の演習にチャレンジしてみてください。

演習

先程のBMIのアプリを改造して、平方根を計算する以下のようなアプリを作成してください。


解答例

import math
import tkinter as tk

root = tk.Tk()
root.title("BMI計算ツール")
root.geometry('200x100')

# 入力欄
num_label = tk.Label(text="平方根を求める数")
num_label.pack()
num_entry = tk.Entry(justify='right')
num_entry.pack()

# 計算結果
ans_label = tk.Label(text="平方根計算結果")
ans_label.pack()

result = tk.StringVar()
num_sqrt_label = tk.Label(text="", textvariable=result)
num_sqrt_label.pack()


def calc_sqrt():
    num = int(num_entry.get())
    num_sqrt = math.sqrt(num)
    result.set(str(num_sqrt))


button = tk.Button(text="計算", command=calc_sqrt)
button.pack()

root.mainloop()