PythonでシンプルなGUIアプリを作ってみた

はじめに

プログラミングを学び始めると、「作ったプログラムを見える形で動かしたい」と思うことがあります。コマンドラインで動くプログラムも便利ですが、ボタンをクリックしたり、テキストを入力したりできるアプリの方が使いやすいと感じる場面も多いでしょう。

Pythonは初心者にも優しい言語として知られていますが、実はGUIアプリ(グラフィカル・ユーザー・インターフェースを持つアプリケーション)も比較的簡単に作れます。この記事では、Pythonの標準ライブラリであるTkinterを使って、シンプルなGUIアプリを作る手順を紹介します。

準備するもの

まずは必要なものを確認しましょう。幸いなことに、Tkinterは多くの場合、Pythonをインストールした時点ですでに含まれています。そのため、特別なインストール作業は必要ないことが多いです。

必要なのは以下のものだけです:

  • Pythonがインストールされたパソコン
  • テキストエディタやIDEなどのコード編集環境

これだけで、早速GUIアプリ作りに挑戦できます。

Tkinterとは?

Tkinterは「ティーケーインター」と読みます。PythonでGUIを作るためのライブラリで、Pythonの標準ライブラリとして含まれています。これは料理でいえば、わざわざ買いに行かなくても、すでに家にある調味料のようなものです。

Tkinterを使うと、ボタンやテキスト入力欄、ラベルといった部品(ウィジェットと呼びます)を画面に配置して、ユーザーが操作できるアプリを作れます。

最初の一歩:シンプルなウィンドウを表示する

まずは最も基本的な例として、ただ空のウィンドウを表示するプログラムを作ってみましょう。

import tkinter as tk

# メインウィンドウを作成
root = tk.Tk()
root.title("はじめてのGUIアプリ")
root.geometry("300x200")  # 幅300px、高さ200pxに設定

# メインループを開始
root.mainloop()
Code language: PHP (php)

このコードを実行すると、「はじめてのGUIアプリ」というタイトルの空のウィンドウが表示されます。mainloop()という部分が重要で、これによってウィンドウが表示され続け、ユーザーの操作を待ち受ける状態になります。車のエンジンをかけておくことで、アクセルを踏んだときに進む準備ができているようなものです。

ウィジェットを追加する

空のウィンドウだけでは面白くありません。次はボタンやラベルなどのウィジェットを追加してみましょう。

import tkinter as tk

# メインウィンドウを作成
root = tk.Tk()
root.title("もう少し進んだGUIアプリ")
root.geometry("300x200")

# ラベルを追加
label = tk.Label(root, text="こんにちは、Tkinterの世界へ!")
label.pack(pady=20)  # 上下に20pxの余白を取る

# ボタンを追加
def button_clicked():
    label.config(text="ボタンがクリックされました!")

button = tk.Button(root, text="クリックしてね", command=button_clicked)
button.pack()

# メインループを開始
root.mainloop()
Code language: PHP (php)

このプログラムでは、テキストを表示するラベルと、クリックできるボタンを追加しました。ボタンをクリックすると、ラベルのテキストが変わります。

pack()というメソッドは、ウィジェットをウィンドウ内に配置するための方法の一つです。積み木を積み上げるように、ウィジェットを順番に配置していきます。

入力を受け付けるアプリを作る

次に、ユーザーからの入力を受け付けるテキスト入力欄を追加してみましょう。

import tkinter as tk

# メインウィンドウを作成
root = tk.Tk()
root.title("入力を受け付けるアプリ")
root.geometry("400x250")

# 説明ラベル
label1 = tk.Label(root, text="あなたの名前を入力してください:")
label1.pack(pady=(20, 5))  # 上に20px、下に5pxの余白

# テキスト入力欄
entry = tk.Entry(root, width=30)
entry.pack()

# 結果表示用ラベル
result_label = tk.Label(root, text="")
result_label.pack(pady=20)

# ボタンの動作を定義
def greet():
    name = entry.get()  # 入力内容を取得
    if name:
        result_label.config(text=f"こんにちは、{name}さん!")
    else:
        result_label.config(text="名前を入力してください")

# ボタンを追加
button = tk.Button(root, text="挨拶する", command=greet)
button.pack()

# メインループを開始
root.mainloop()
Code language: PHP (php)

このアプリでは、テキスト入力欄(Entry)を追加し、「挨拶する」ボタンをクリックすると、入力された名前を使って挨拶文を表示します。

レイアウトを整える

これまでの例ではpack()メソッドを使ってウィジェットを配置していましたが、より細かくレイアウトを制御するにはgrid()メソッドが便利です。これは表計算ソフトのセルのように、行と列でウィジェットを配置できます。

import tkinter as tk

# メインウィンドウを作成
root = tk.Tk()
root.title("計算機アプリ")
root.geometry("300x200")
root.resizable(False, False)  # サイズ変更不可に設定

# 入力欄
entry1 = tk.Entry(root, width=10)
entry1.grid(row=0, column=0, padx=5, pady=10)

# 「+」ラベル
plus_label = tk.Label(root, text="+")
plus_label.grid(row=0, column=1)

# 入力欄2
entry2 = tk.Entry(root, width=10)
entry2.grid(row=0, column=2, padx=5, pady=10)

# 「=」ラベル
equals_label = tk.Label(root, text="=")
equals_label.grid(row=0, column=3)

# 結果ラベル
result_label = tk.Label(root, text="?", width=10)
result_label.grid(row=0, column=4, padx=5)

# 計算ボタンの動作
def calculate():
    try:
        num1 = float(entry1.get())
        num2 = float(entry2.get())
        result = num1 + num2
        result_label.config(text=str(result))
    except ValueError:
        result_label.config(text="エラー")

# 計算ボタン
calc_button = tk.Button(root, text="計算する", command=calculate)
calc_button.grid(row=1, column=0, columnspan=5, pady=10)

# メインループを開始
root.mainloop()
Code language: PHP (php)

このプログラムでは、2つの数値を入力して足し算をする簡単な計算機アプリを作りました。grid()メソッドを使うことで、ウィジェットを格子状に配置できます。

実用的なアプリを作る:TODOリスト

これまでの知識を組み合わせて、少し実用的なTODOリストアプリを作ってみましょう。

import tkinter as tk
from tkinter import messagebox

# メインウィンドウを作成
root = tk.Tk()
root.title("TODOリストアプリ")
root.geometry("400x500")

# フレームを作成(見た目を整えるため)
frame = tk.Frame(root)
frame.pack(pady=10)

# TODOリスト用のリストボックス
todo_list = tk.Listbox(
    frame,
    width=50,
    height=15,
    bd=0,
    font=("Helvetica", 12),
    selectbackground="#a6a6a6"
)
todo_list.pack(side=tk.LEFT, fill=tk.BOTH)

# スクロールバーを追加
scrollbar = tk.Scrollbar(frame)
scrollbar.pack(side=tk.RIGHT, fill=tk.BOTH)

# リストボックスとスクロールバーを連動させる
todo_list.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=todo_list.yview)

# 入力欄
entry = tk.Entry(root, font=("Helvetica", 12))
entry.pack(pady=10)

# ボタンフレーム
button_frame = tk.Frame(root)
button_frame.pack(pady=10)

# タスク追加の関数
def add_task():
    task = entry.get()
    if task:
        todo_list.insert(tk.END, task)
        entry.delete(0, tk.END)
    else:
        messagebox.showwarning("警告", "タスクを入力してください")

# タスク削除の関数
def delete_task():
    try:
        task_index = todo_list.curselection()[0]
        todo_list.delete(task_index)
    except IndexError:
        messagebox.showwarning("警告", "削除するタスクを選択してください")

# ボタンを作成
add_button = tk.Button(
    button_frame,
    text="タスク追加",
    command=add_task,
    bg="#90EE90",
    width=15
)
add_button.pack(side=tk.LEFT, padx=5)

delete_button = tk.Button(
    button_frame,
    text="タスク削除",
    command=delete_task,
    bg="#FFB6C1",
    width=15
)
delete_button.pack(side=tk.LEFT, padx=5)

# メインループを開始
root.mainloop()
Code language: PHP (php)

このアプリでは、タスクを入力して追加ボタンをクリックするとリストに追加され、リストからタスクを選択して削除ボタンをクリックするとそのタスクが削除されます。messageboxを使ってエラーメッセージも表示できるようにしました。

GUIアプリ作りのコツ

GUIアプリを作る際には、以下のポイントを意識すると良いでしょう。

  1. シンプルに始める: 最初は必要最低限の機能から始め、徐々に機能を追加していきましょう。
  2. ユーザーの視点で考える: 操作しやすいボタンの配置や、わかりやすいラベルの表示を心がけましょう。
  3. エラー処理を忘れない: ユーザーが予期しない入力をした場合にも、適切に対応できるようにしましょう。
  4. テストを繰り返す: 自分だけでなく、できれば他の人にも使ってもらい、改善点を見つけましょう。

発展:他のGUIライブラリ

Tkinterは手軽に始められる反面、見た目が少し古風で機能にも限りがあります。より本格的なアプリを作りたい場合は、以下のようなライブラリも検討してみてください。

  • PyQt/PySide: より美しく高機能なGUIを作れますが、学習コストは高めです。
  • wxPython: OSネイティブの見た目を持つGUIを作れます。
  • Kivy: マルチタッチに対応したモバイルアプリも作れる強力なフレームワークです。

まとめ

PythonのTkinterを使えば、プログラミング初心者でも比較的簡単にGUIアプリを作れます。この記事で紹介した基本的な知識をもとに、自分だけのオリジナルアプリに挑戦してみてください。ウィンドウの表示、ウィジェットの配置、イベント処理の基本さえ押さえれば、あとは想像力次第でさまざまなアプリが作れます。