初心者向け No.01

Hello World ウィンドウ

Pythonで最初のGUIアプリを作ります。tkinterを使ってウィンドウを表示し、ラベルやボタンの基本を学びます。

🎯 難易度: ★☆☆ 易しい 📦 ライブラリ: tkinter(標準ライブラリ) ⏱️ 制作時間: 15〜30分

1. アプリ概要

「Hello World」はプログラミング学習の第一歩です。このアプリでは、Pythonの標準GUIライブラリ「tkinter」を使って最初のウィンドウを作成します。

tkinterはPythonに標準で付属しているため、追加インストールは不要です。Windows・Mac・Linuxのどのプラットフォームでも動作します。このアプリを通して、ウィンドウの作成・タイトルの設定・ラベルの表示・ボタンのクリックイベント処理という、GUI開発の基礎となる4つのスキルを習得します。

GUIアプリの基本的な構造は「ウィンドウ(root)→ ウィジェット(Label/Button等)→ イベントループ(mainloop)」という3層になっています。この構造を最初にしっかり理解することが、より複雑なアプリを作る上での重要な基盤となります。

また、ウィジェットの配置方法としてpack・grid・placeの3種類があり、このアプリではまずpackを使いつつ、それぞれの違いも解説します。初心者がつまずきやすいメインループの仕組みについても、図を使いながら丁寧に説明します。

Hello World ウィンドウ 起動時の画面
起動時の画面
Hello World ウィンドウ ボタンクリック後の画面
ボタンクリック後

2. 機能一覧

  • ウィンドウの表示とタイトル設定
  • Labelウィジェットでのテキスト表示
  • Buttonウィジェットとクリックイベント
  • ウィンドウサイズとアイコンの設定
  • フォントと文字色のカスタマイズ

3. 事前準備・環境

ℹ️
動作確認環境

Python 3.10 以上 / Windows・Mac・Linux すべて対応

tkinterはPythonの標準ライブラリのため、追加インストールは不要です。Pythonがインストールされていれば即座に使えます。

💡
Linuxの場合は別途インストールが必要

Ubuntu/Debianの場合は sudo apt install python3-tk を実行してください。

4. 完全なソースコード

💡
コードのコピー方法

右上の「コピー」ボタンをクリックするとコードをクリップボードにコピーできます。

app01.py
import tkinter as tk
from tkinter import font as tkfont


def on_button_click():
    """ボタンがクリックされたときの処理"""
    current = label_message.cget("text")
    if current == "Hello, World!":
        label_message.config(
            text="Pythonの学習を始めよう!",
            fg="#e74c3c"
        )
    else:
        label_message.config(
            text="Hello, World!",
            fg="#2c3e50"
        )


def on_hover_enter(event):
    """マウスオーバー時にボタンの色を変える"""
    btn_greet.config(bg="#2980b9")


def on_hover_leave(event):
    """マウスが離れたときにボタンの色を元に戻す"""
    btn_greet.config(bg="#3498db")


# ============================================================
# ウィンドウの作成
# ============================================================
root = tk.Tk()
root.title("Hello World - Python GUI入門")
root.geometry("420x280")
root.resizable(False, False)        # サイズ変更を禁止
root.configure(bg="#ecf0f1")        # 背景色

# ============================================================
# フォント定義
# ============================================================
font_title = tkfont.Font(family="Noto Sans JP", size=20, weight="bold")
font_body  = tkfont.Font(family="Noto Sans JP", size=12)
font_btn   = tkfont.Font(family="Noto Sans JP", size=11, weight="bold")

# ============================================================
# ウィジェットの配置
# ============================================================
# タイトルラベル
label_title = tk.Label(
    root,
    text="🐍 Python GUI 入門",
    font=font_title,
    bg="#3498db",
    fg="white",
    pady=12
)
label_title.pack(fill=tk.X)

# メッセージラベル
label_message = tk.Label(
    root,
    text="Hello, World!",
    font=("Noto Sans JP", 24, "bold"),
    bg="#ecf0f1",
    fg="#2c3e50",
    pady=30
)
label_message.pack()

# ボタン
btn_greet = tk.Button(
    root,
    text="クリックしてね!",
    font=font_btn,
    bg="#3498db",
    fg="white",
    activebackground="#2980b9",
    activeforeground="white",
    relief=tk.FLAT,
    padx=20,
    pady=8,
    cursor="hand2",         # カーソルを手の形に
    command=on_button_click
)
btn_greet.pack()

# ホバーイベントをバインド
btn_greet.bind("", on_hover_enter)
btn_greet.bind("", on_hover_leave)

# 説明ラベル
label_hint = tk.Label(
    root,
    text="ボタンをクリックするとメッセージが変わります",
    font=("Noto Sans JP", 9),
    bg="#ecf0f1",
    fg="#7f8c8d"
)
label_hint.pack(pady=(8, 0))

# ============================================================
# イベントループ開始(これを忘れるとウィンドウが表示されない)
# ============================================================
root.mainloop()

5. コード解説

コードを上から順に解説します。各部分の役割をしっかり理解しましょう。

import文:tkinterのインポート

tkinterはPythonの標準GUIライブラリです。import tkinter as tk とすることで、以降 tk.Tk() のように短い名前で呼び出せます。from tkinter import font as tkfont はフォントを細かく設定するためのサブモジュールです。

import tkinter as tk
from tkinter import font as tkfont

関数の定義:on_button_click()

ボタンがクリックされたときに実行される関数です。label_message.cget("text") で現在のラベルのテキストを取得し、config() でテキストと文字色を変更します。このように「現在の状態を見て次の状態を決める」パターンはGUIプログラミングで頻繁に使われます。

def on_button_click():
    current = label_message.cget("text")
    if current == "Hello, World!":
        label_message.config(text="変更後", fg="#e74c3c")

ルートウィンドウの作成:tk.Tk()

root = tk.Tk() でメインウィンドウを作成します。これがすべてのウィジェットの親となります。title() でウィンドウタイトル、geometry() でサイズ(幅x高さ)、resizable(False, False) でサイズ変更を禁止します。

root = tk.Tk()
root.title("Hello World")
root.geometry("420x280")
root.resizable(False, False)

Labelウィジェット:テキスト表示

tk.Label() でテキストや画像を表示するウィジェットを作成します。第1引数は親ウィジェット(root)、以降はオプション引数です。pack() を呼ぶことでウィンドウに配置されます。pack()を呼ばないと表示されないので注意しましょう。

label_message = tk.Label(
    root,
    text="Hello, World!",
    font=("Arial", 24, "bold"),
    fg="#2c3e50"
)
label_message.pack()

Buttonウィジェット:クリックイベント

tk.Button() でボタンを作成します。command=on_button_click でクリック時に実行する関数を指定します。注意点は command=on_button_click(カッコなし)であることです。command=on_button_click()(カッコあり)にすると即座に実行されてしまいます。

btn_greet = tk.Button(
    root,
    text="クリック",
    command=on_button_click  # カッコなし!
)

イベントバインド:bind()

bind() を使うと、マウスオーバー・キー入力・マウスクリックなど様々なイベントに関数を結びつけられます。<Enter> はマウスがウィジェット上に来たとき、<Leave> は離れたときのイベントです。引数 event にはイベント情報が渡されます。

btn_greet.bind("", on_hover_enter)
btn_greet.bind("", on_hover_leave)

mainloop():イベントループ

root.mainloop() はプログラムの最後に必ず書きます。これを実行することで、ウィンドウが表示され、クリックや入力などのイベントを待ち受けるループが始まります。ウィンドウを閉じるまでこのループは続きます。これを書き忘れると、ウィンドウが一瞬表示されてすぐ閉じてしまいます。

root.mainloop()  # この1行でGUIアプリが起動する

6. ステップバイステップガイド

このアプリをゼロから自分で作る手順を解説します。コードをコピーするだけでなく、実際に手順を追って自分で書いてみましょう。

  1. 1
    ファイルを作成する

    VSCodeを開き、新しいファイルを作成して app01.py と名前をつけて保存します。

  2. 2
    tkinterをインポートする

    ファイルの先頭に import 文を記述します。

    import tkinter as tk
  3. 3
    メインウィンドウを作る

    tk.Tk() でウィンドウを作成し、タイトルとサイズを設定します。

    root = tk.Tk()
    root.title("Hello World")
    root.geometry("400x250")
  4. 4
    ラベルを配置する

    テキストを表示するLabelウィジェットを追加します。

    label = tk.Label(root, text="Hello, World!", font=("Arial", 20))
    label.pack(pady=30)
  5. 5
    ボタンを配置する

    クリックイベント付きのButtonウィジェットを追加します。

    btn = tk.Button(root, text="クリック", command=lambda: print("clicked!"))
    btn.pack()
  6. 6
    mainloop()を追加する

    最後にmainloop()を呼び出してウィンドウを表示します。

    root.mainloop()
  7. 7
    実行して確認する

    ターミナルで python app01.py を実行してウィンドウが表示されることを確認します。

7. カスタマイズアイデア

基本機能を習得したら、以下のカスタマイズに挑戦してみましょう。少しずつ機能を追加することで、Pythonのスキルが飛躍的に向上します。

💡 ウィンドウを画面中央に配置する

起動時にウィンドウを画面中央に表示するには、ウィンドウサイズと画面サイズから座標を計算します。

root.update_idletasks()
w = root.winfo_width()
h = root.winfo_height()
sw = root.winfo_screenwidth()
sh = root.winfo_screenheight()
x = (sw - w) // 2
y = (sh - h) // 2
root.geometry(f"+{x}+{y}")

💡 カウンター機能を追加する

ボタンをクリックした回数を表示するカウンターを追加してみましょう。グローバル変数またはクラス変数でカウントを管理します。

count = 0
def on_click():
    global count
    count += 1
    label.config(text=f"クリック回数: {count}")

💡 アイコンを設定する

ウィンドウのタイトルバーに独自のアイコンを設定できます。ICO形式(Windows)またはPNG形式(Mac/Linux)のファイルを用意してください。

# Windows
root.iconbitmap("icon.ico")
# Mac/Linux
icon = tk.PhotoImage(file="icon.png")
root.iconphoto(True, icon)

💡 テーマカラーを変更する

bg・fg・activebackground などのオプションで色をカスタマイズできます。Webカラー(#RRGGBB形式)と色の名前('red', 'blue'など)の両方が使えます。

8. よくある問題と解決法

❌ ウィンドウが表示されない・すぐ閉じる

原因:mainloop()を呼び忘れています。

解決法:コードの最後に root.mainloop() を追加してください。

❌ 日本語が文字化けする・表示されない

原因:フォントが日本語に対応していない可能性があります。

解決法:fontオプションに日本語対応フォントを指定してください。

label = tk.Label(root, text="日本語テスト",
    font=("Noto Sans JP", 12))  # Windowsは"Yu Gothic"など

❌ NameError: name 'label' is not defined

原因:関数内からウィジェットを参照するときにスコープの問題が起きています。

解決法:関数の外でウィジェットを定義してグローバルとして扱うか、クラスを使ってself.labelとして管理しましょう。

9. 練習問題

アプリの理解を深めるための練習問題です。難易度順に挑戦してみてください。

  1. 課題1:ボタン複数配置

    「こんにちは」「さようなら」「ありがとう」の3つのボタンを作成し、それぞれのボタンをクリックするとラベルに対応するメッセージが表示されるようにしましょう。

  2. 課題2:クリックカウンター

    ボタンを何回クリックしたかを数えて表示する「クリックカウンター」を作りましょう。10回ごとにメッセージが変わるようにすると面白いです。

  3. 課題3:カラーチェンジャー

    ボタンをクリックするたびにウィンドウの背景色がランダムに変わるアプリを作ってみましょう。randomモジュールを使ってHEXカラーを生成します。

🚀
次に挑戦するアプリ

Hello Worldの次は、Gridレイアウトを使ったシンプル電卓に挑戦しましょう。