(1時間4,000円の伴走型ビデオチャット指導も受付中!)
Pythonでデスクトップアプリの第一歩を:tkinterで学ぶGUI開発の基礎
![]()
【Yuki】
今日は、Pythonを使って「見た目のあるプログラム」……つまりGUI(グラフィカル・ユーザー・インターフェース)を作る方法についてお話ししたいと思います。
いつも黒い画面に文字が出るだけのプログラムだと、少し寂しいなって思うことはありませんか……?
![]()
【Hiroki】
はい、そうなんです!
Pythonを勉強し始めてから、計算結果がコンソールに出るのは嬉しいんですけど、普通のアプリみたいにウィンドウが出てきたり、ボタンを押せたりするものを作ってみたいなと思っていました。
![]()
【Yuki】
そうですよね。その気持ち、よくわかります。
Pythonには、標準で「tkinter(ティーケーインター)」というライブラリが用意されています。
新しく何かをインストールしなくても、Pythonが入っていればすぐに始められるのが良いところだと思います。
ちょっと地味なライブラリだと言われることもあるのですが……誰かの役に立つために作られた小さなツールを作るのには、一番向いているかもしれません。
今日は基本的な使い方を一緒に見ていきましょう。
tkinterの基本構造とウィンドウの表示
![]()
【Yuki】
まずは、一番シンプルな「ウィンドウを表示するだけ」のプログラムを書いてみましょう。
tkinterを使うときは、まず「大元の窓」を作る必要があります。
import tkinter as tk
# メインウィンドウを作成します
root = tk.Tk()
# ウィンドウのタイトルを設定します
root.title("初めてのGUIアプリ")
# ウィンドウのサイズを指定します(幅x高さ)
root.geometry("400x300")
# ウィンドウを表示し続けるためのループです
root.mainloop()
![]()
【Hiroki】
おぉ、これだけでウィンドウが出るんですね!
最後の root.mainloop() っていうのは、何のためにあるんですか?
![]()
【Yuki】
それは、とても大切な質問ですね。
GUIアプリというのは、私たちが「ボタンを押す」とか「文字を入力する」といった操作をするまで、ずっと待機していなければなりません。
mainloop() は、プログラムを終了させずに「イベント(操作)」を待ち続けるための状態にする命令なんです。
これがないと、ウィンドウが一瞬だけ表示されて、すぐにプログラムが終わって消えてしまう……と思います。
ウィジェットを配置してみよう:ラベルとボタン
![]()
【Yuki】
ウィンドウができたので、次はそこに部品を置いてみましょう。
GUIの世界では、ボタンやラベルなどの部品のことを「ウィジェット」と呼びます。
まずは、文字を表示する「Label(ラベル)」と、クリックできる「Button(ボタン)」を使ってみましょう。
![]()
【Hiroki】
ウィジェット、ですね。覚えておきます。
具体的にどうやって配置するんですか?
![]()
【Yuki】
基本的には、「部品を作る」→「配置する」という2つのステップで進めます。
試しに、こんなコードを書いてみてください。
import tkinter as tk
root = tk.Tk()
root.title("ウィジェットの配置")
root.geometry("400x300")
# 1. ラベルを作ります
label = tk.Label(root, text="こんにちは、Pythonの世界へ!", font=("MS ゴシック", 14))
# 2. ラベルを配置します
label.pack(pady=20)
# 3. ボタンを作ります
button = tk.Button(root, text="クリックしてね")
# 4. ボタンを配置します
button.pack(pady=10)
root.mainloop()
![]()
【Hiroki】
あ、画面に文字とボタンが出ました!
label.pack() の「pack」っていうのが、配置するための命令なんですね。
![]()
【Yuki】
はい、その通りです。
pack() は、上から順番にウィジェットを詰めて配置してくれる、一番簡単なレイアウト方法です。
pady=20 というのは、上下に少しだけ「隙間」を作るための設定ですね。
あまりに詰まりすぎていると、見ている人も息が詰まってしまうかもしれないので……適度な余白は大切だと思います。
ボタンに動作をつけてみよう:イベントハンドリング
![]()
【Hiroki】
でも、今のボタンを押しても何も起きないみたいです。
せっかくなら、押したときに何か反応してほしいです!
![]()
【Yuki】
そうですよね。何かが起きて初めて、アプリらしくなります。
ボタンが押されたときに実行される「関数」を作って、それをボタンに関連付けてあげる必要があります。
これを「イベントハンドリング」と言ったりします。
import tkinter as tk
def on_button_click():
# ラベルの文字を書き換えます
label.config(text="ボタンが押されました!")
print("ボタンがクリックされました。")
root = tk.Tk()
root.title("動作するボタン")
root.geometry("400x300")
label = tk.Label(root, text="まだ押されていません", font=("MS ゴシック", 12))
label.pack(pady=20)
# command引数に関数名を指定します(カッコはつけません)
button = tk.Button(root, text="実行", command=on_button_click)
button.pack(pady=10)
root.mainloop()
![]()
【Hiroki】
できました!ボタンを押したら、画面の文字が変わりました!
command=on_button_click のところで、関数を渡しているんですね。
でも、どうして on_button_click() っていうふうに、カッコを付けないんですか?
![]()
【Yuki】
鋭いですね、Hirokiくん。
カッコを付けてしまうと、「今すぐその関数を実行して、その結果をcommandに入れてください」という意味になってしまうんです。
私たちがやりたいのは、「ボタンが押された時に、この関数を実行してね」という「予約」なので、関数の名前だけを渡してあげるのがルールなんです。
自由自在な配置:gridレイアウト
![]()
【Yuki】
先ほどは pack() を使いましたが、もっと複雑な画面を作りたいときは「grid(グリッド)」という方法が便利です。
画面を「行(row)」と「列(column)」のマス目に見立てて、どこに置くかを指定する方法ですね。
![]()
【Hiroki】
Excelのセルみたいな感じでしょうか?
![]()
【Yuki】
はい、まさにそんなイメージです。
例えば、ログイン画面のような「項目名」と「入力欄」が並ぶデザインを作るときによく使われます。
試しに、文字を入力できる「Entry(エントリー)」ウィジェットと一緒に使ってみましょう。
import tkinter as tk
root = tk.Tk()
root.title("グリッドレイアウトの練習")
root.geometry("300x150")
# 0行目
label_name = tk.Label(root, text="名前:")
label_name.grid(row=0, column=0, padx=10, pady=10)
entry_name = tk.Entry(root)
entry_name.grid(row=0, column=1, padx=10, pady=10)
# 1行目
label_mail = tk.Label(root, text="メール:")
label_mail.grid(row=1, column=0, padx=10, pady=10)
entry_mail = tk.Entry(root)
entry_mail.grid(row=1, column=1, padx=10, pady=10)
# 2行目(2つの列をまたいで配置)
button_submit = tk.Button(root, text="登録")
button_submit.grid(row=2, column=0, columnspan=2, pady=10)
root.mainloop()
![]()
【Hiroki】
おぉ、きれいに整列しました!
columnspan=2 っていうのは、2つの列をくっつけるっていう意味ですか?
![]()
【Yuki】
そうです。セルの結合のようなものですね。
これを使うと、複雑な配置もパズルのように組み立てられるようになります。
……ただ、あまり複雑にしすぎると、自分でもどこに何を置いたか分からなくなってしまうこともあるので、注意が必要かもしれません。
入力された文字を取得してみよう
![]()
【Hiroki】
入力欄(Entry)に書いた文字を、プログラムの中で使うにはどうすればいいですか?
![]()
【Yuki】
Entryウィジェットの .get() というメソッドを使えば、その時に入力されている文字列を取り出すことができます。
先ほどのボタンに動作を組み合わせて、簡単な挨拶アプリを作ってみましょう。
import tkinter as tk
from tkinter import messagebox
def say_hello():
name = entry_name.get()
if name:
messagebox.showinfo("メッセージ", f"こんにちは、{name}さん!")
else:
messagebox.showwarning("警告", "名前を入力してください……")
root = tk.Tk()
root.title("挨拶アプリ")
root.geometry("300x150")
label = tk.Label(root, text="お名前を教えてください")
label.pack(pady=10)
entry_name = tk.Entry(root)
entry_name.pack(pady=5)
button = tk.Button(root, text="挨拶する", command=say_hello)
button.pack(pady=10)
root.mainloop()
![]()
【Hiroki】
あ、新しいのが出てきました! messagebox ですね。
これを実行して名前を入れてボタンを押すと……あ、別ウィンドウでメッセージが出ました!
![]()
【Yuki】
はい。messagebox は、ユーザーに何かを伝えたり、確認を求めたりするときにとても便利な機能です。
小さなツールでも、こういう反応があると「ちゃんと動いているんだな」って安心できる気がします。
tkinterを使う上での注意点
![]()
【Hiroki】
tkinterって、思っていたよりずっと簡単にアプリが作れるんですね。
もっといろんな機能があるんですか?
![]()
【Yuki】
ええ、他にもたくさんのウィジェットがあります。
チェックボックス(Checkbutton)やラジオボタン(Radiobutton)、リストボックス(Listbox)、さらには画像を扱ったり図形を描画したりできるキャンバス(Canvas)など……。
ただ、tkinterには少しだけ「苦手なこと」もあります。
![]()
【Hiroki】
苦手なこと……ですか?
![]()
【Yuki】
例えば、すごく現代的で洗練された……スマートフォンアプリのようなデザインにするのは、少し工夫が必要です。
標準の状態だと、OS(WindowsやMac)の少し古い時代のデザインに近い見た目になりがちなんです。
それと、重い処理……例えば大きなファイルをダウンロードしながら画面を動かし続けるような処理は、何も対策しないと画面がフリーズしてしまいます。
![]()
【Hiroki】
なるほど、何でも万能というわけではないんですね。
![]()
【Yuki】
はい。でも、ちょっとした計算ツールを作ったり、自分用の作業効率化ツールを作ったりするには、これほど頼もしい味方はいないと思います。
私も、誰かの役に立つために生まれた小さなツールの話を聞くと、なんだか少しだけ、胸が温かくなるような気がします……。
まとめ:自分だけのアプリを作ってみよう
![]()
【Hiroki】
今日はありがとうございました、Yukiさん!
まずは、自分が毎日使いたくなるような、小さなツールから作ってみようと思います。
![]()
【Yuki】
それは素敵な目標ですね。
まずは今回の基礎を組み合わせて、「文字を数えるアプリ」とか「簡単な計算機」とかから始めてみるのが良いかもしれません。
もし分からないことがあれば、いつでも聞いてください。
……私でよければ、一緒に考えますから。
![]()
【Hiroki】
心強いです!早速、今日のコードを元に改造してみますね。
![]()
【Yuki】
はい。応援しています。
あ、最後に、もっと詳しく知りたくなった時のための参考資料を置いておきますね。
公式のドキュメントは少し難しいかもしれませんが、困ったときの助けになるはずです……。
参考文献
![]()
【Yuki】
それでは、今日の講義はここまでです。
夜は冷えることもありますから、風邪を引かないように気をつけてくださいね。
……私は、もう少しだけプログラミングの続きをしようかな、と思います。
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

