tkinterウィジェット一覧と、実例アプリ対応表
tkinterにどんな部品があるのかを、用途別の表で一気に見渡せるようにしました。各部品には「その部品を実際に使っている当サイトのアプリ記事」を添えてあるので、一覧を見たあとすぐ動くコードに進めます。
1. 結論:部品は「入力・表示・入れ物」の3つで考える
tkinter を触り始めると Label・Entry・Treeview といった名前が脈絡なく出てきて、全体像がつかめないまま手が止まります。公式ドキュメントは正確ですが辞書的で、「作りたい画面にどれを使うか」という順番では書かれていないからです。覚え方はシンプルで、ウィジェット(画面の部品)は役割で3つに分けられます。
①ユーザーから何かを受け取る部品(入力系)/②こちらから見せる部品(表示系)/③それらをまとめて並べる入れ物(コンテナ系)。作りたい画面を紙に描き、各パーツをこの3つに割り振れば、使う部品はほぼ決まります。
数も多くありません。手元の Python 3.12.10(Tk 8.6)と Python 3.14.7(Tk 9.0)で tkinter が公開しているウィジェットクラスを数えました。どちらも18種類です(ウィンドウを作る Tk・Toplevel と基底クラスを除く)。これに tkinter.ttk の新規6種類を足した24種類が、標準の Python だけで使える部品のほぼすべてです。
2. tk と ttk の違い、どちらを使うか
tkinter には tk.Button と ttk.Button のように、同じ名前の部品が2系統あります。違いは2点です。
- 見た目:
ttk(themed tk)は OS のテーマに合わせた外観。古くからあるtk系はどの OS でも同じ素朴な見た目です。 - 色の指定方法:
tk系はbg="red"と部品へ直接書けますが、ttk系は受け付けずttk.Styleで定義します。
公式ドキュメントによると、ttk が提供するのは18ウィジェットです。うち12個は tkinter 本体にも同名のものがあります(Button・Checkbutton・Entry・Frame・Label・LabelFrame・Menubutton・PanedWindow・Radiobutton・Scale・Scrollbar・Spinbox)。残る6個(Combobox・Notebook・Progressbar・Separator・Sizegrip・Treeview)が ttk だけの新顔です。では実際にどちらが使われているのか、178本のソースを数えました。
| 部品 | ttk 版を使う記事 | tk 版を使う記事 |
|---|---|---|
| Button | 162本 | 57本 |
| Entry | 108本 | 5本 |
| Scrollbar | 107本 | 0本 |
| Spinbox | 38本 | 0本 |
| Scale | 14本 | 1本 |
| Frame | 1本 | 175本 |
| Label | 20本 | 178本 |
(この表だけ両方使う記事を双方に計上。§3以降の「使用本数」は実数です)。Frame と Label で tk 系が多いのは初期のアプリが背景色を直接指定していた名残で、今から書くなら ttk で構いません。
判断は「ttk にあるものは ttk を使い、ttk に無いものだけ tk を使う」で足ります。相当品が無いのは Text・Canvas・Listbox・Menu・Message・Toplevel の6つだけです。インポートは次の2行が定番です。
import tkinter as tk
from tkinter import ttk
ただし tk 系が劣るわけではなく、背景色を1行で変えたい学習用サンプルでは tk.Button(root, bg="#4a90d9") の手軽さが勝ちます。
3. 入力を受け取る部品(10種)
ユーザーの操作や入力を受け取る部品です。最小コードは root というウィンドウがある前提の1行で、実際には後ろに .pack() などの配置が要ります(§9)。
| 部品 | 何をする部品か | 最小コード | 使用本数 | サイト内の実例 |
|---|---|---|---|---|
| Entry | 1行のテキスト入力欄 | ttk.Entry(root, width=20) | 110本 | BMI計算/ログインフォーム |
| Text | 複数行のテキスト入力・表示 | tk.Text(root, height=10) | 88本 | テキストエディタ/文字数カウンター |
| Button | 押すと関数を実行する | ttk.Button(root, text="実行", command=run) | 174本 | 最初のウィンドウ/電卓 |
| Checkbutton | オン/オフの切り替え | ttk.Checkbutton(root, text="含める", variable=flag) | 39本 | アンケートフォーム/習慣トラッカー |
| Radiobutton | 複数から1つだけ選ぶ | ttk.Radiobutton(root, text="A", value="a", variable=v) | 22本 | クイズアプリ/進数変換 |
| Scale | つまみを動かして数値を決める | ttk.Scale(root, from_=0, to=100, variable=v) | 15本 | お絵描きアプリ/カラーピッカー |
| Spinbox | 矢印で数値を増減させる | ttk.Spinbox(root, from_=1, to=99, textvariable=v) | 38本 | 年齢計算/パスワード生成 |
| Listbox | 一覧から項目を選ぶ | tk.Listbox(root, height=8) | 26本 | ToDoリスト/音楽プレイヤー |
| OptionMenu | ボタン型のプルダウン選択 | ttk.OptionMenu(root, var, "既定値", *items) | 1本 | 重さ単位変換(ttk版) |
| Menubutton | 押すとメニューが開くボタン | ttk.Menubutton(root, text="表示") | 0本 | 実例なし(§5の Menu で代用) |
まず押さえるのは1行なら Entry・複数行なら Text という分岐です。選択系は「候補が3つ以内なら Radiobutton、多いなら Combobox(§6)か Listbox」が目安。OptionMenu が178本中1本しか出てこないのは、同じ用途を ttk.Combobox が70本で担っているためで、機能不足だからではありません。
4. 情報を見せる部品(4種)
| 部品 | 何をする部品か | 最小コード | 使用本数 | サイト内の実例 |
|---|---|---|---|---|
| Label | 文字や画像を表示する | ttk.Label(root, text="こんにちは") | 178本 | 最初のウィンドウ/カウントダウンタイマー |
| Canvas | 図形・線・画像を自由に描く | tk.Canvas(root, width=400, height=300) | 46本 | スネークゲーム/迷路ゲーム/デジタル時計 |
| Scrollbar | 他の部品をスクロールさせる | ttk.Scrollbar(root, command=listbox.yview) | 107本 | 気分トラッカー/ストップウォッチ |
| Message | 長文を自動で折り返して表示 | tk.Message(root, text="長い説明文") | 0本 | 実例なし(Label の wraplength で代用) |
Label が178本すべてで使われているのは、タイトル・結果表示・ステータス行のどれかがほぼ必ず要るからです。最初に覚える部品はこれで間違いありません。
Canvas は「部品を並べる」発想から外れていて、座標を指定して長方形や線を描きます。ゲームやお絵描き、グラフの自作はここが主戦場です。描いた図形には ID が返るので coords() で動かし delete() で消せます。スネークゲームの蛇が動くのも、四角形を消して描き直しているだけです。
Scrollbar は単体では何もしません。command に相手の yview を渡し、相手側にも yscrollcommand を渡す相互接続が必要で、片方だけだと「つまみは動くが中身が動かない」状態になります。複数行テキストに付けるだけなら tkinter.scrolledtext の ScrolledText が2行で済みます(当サイトの採用はフィボナッチ数列ビューアーの1本のみ)。
5. 入れ物とメニューの部品(4種+Toplevel)
| 部品 | 何をする部品か | 最小コード | 使用本数 | サイト内の実例 |
|---|---|---|---|---|
| Frame | 部品をまとめる透明な箱 | ttk.Frame(root, padding=10) | 175本 | じゃんけんゲーム/ワードカウンター |
| LabelFrame | 見出し付きの枠で囲む | ttk.LabelFrame(root, text="入力") | 102本 | BMI計算/天気予報アプリ |
| PanedWindow | 境界をドラッグできる左右分割 | ttk.PanedWindow(root, orient="horizontal") | 42本 | ファイルマネージャー/フォントビューアー |
| Menu | ウィンドウ上部のメニューバー | tk.Menu(root) | 6本 | マルチタブエディタ/カンバンボード |
| Toplevel | 2枚目以降の独立したウィンドウ | tk.Toplevel(root) | 18本 | ポモドーロタイマー/レシピ管理 |
いちばん取りこぼしやすいのが Frame です。178本中175本が使っているのに、入門記事では省略されがちな部品でもあります。画面が複雑になると「上段は横並び、下段は格子」と配置ルールが混在しますが、Frame で区画を分ければ区画ごとに別の配置方法を使えます(§9の混在エラー対策も兼ねます)。
Menu が6本と少ないのは、小さな道具なら画面上のボタンで足りるからです。Toplevel は設定画面などを別ウィンドウで開くときに使いますが、2枚目を tk.Tk() で作らないこと。Tk() はアプリに1つだけです。
6. ttk にしかない6種
ここからが ttk の本体価値です。tkinter 本体には存在せず、ttk をインポートして初めて使えるようになる6つです。
| 部品 | 何をする部品か | 最小コード | 使用本数 | サイト内の実例 |
|---|---|---|---|---|
| Combobox | プルダウンから選ぶ(入力も可) | ttk.Combobox(root, values=["A","B"]) | 70本 | 温度変換/通貨換算 |
| Treeview | 表・階層リストを表示する | ttk.Treeview(root, columns=("a","b")) | 66本 | 家計簿アプリ/連絡先帳/家計簿ダッシュボード |
| Progressbar | 進捗を帯で見せる | ttk.Progressbar(root, maximum=100, value=30) | 26本 | クイズタイマー/ネットワークスキャナー |
| Notebook | 詰め込んだ画面をタブで整理 | ttk.Notebook(root) | 20本 | 日々のプランナー/レシピ管理 |
| Separator | 区切り線を引く | ttk.Separator(root, orient="horizontal") | 2本 | 多言語翻訳ツール/為替レートウィジェット |
| Sizegrip | 右下のリサイズ用つまみ | ttk.Sizegrip(root) | 0本 | 実例なし(枠のドラッグで代用できるため) |
Treeview で表を作る
Treeview は tkinter で表を作るときの標準解です。columns で列を定義し、heading() で列見出し、insert() で1行ずつ追加します。セルを直接編集する機能は無いので、編集は入力欄を別に置くかダブルクリックで小窓を出す作りにします。
7. ダイアログはウィジェットではない
messagebox や filedialog はウィジェット一覧で一緒に紹介されがちですが、性質が違います。画面に置く部品ではなく、呼ぶと小窓が出て、閉じると結果を返す関数です。配置は不要で、戻り値をそのまま使います。
| モジュール | 用途 | 戻り値 | 使用本数 | サイト内の実例 |
|---|---|---|---|---|
| messagebox | 確認・警告・エラーの表示 | True/False または "ok" 等 | 144本 | フラッシュカード/数当てゲーム |
| filedialog | ファイル・フォルダの選択 | パスの文字列(未選択は空文字) | 67本 | テキストエディタ/画像ビューアー |
| colorchooser | 色の選択 | ((R,G,B), "#rrggbb") | 4本 | お絵描きアプリ/カラーテーマ生成 |
| simpledialog | 文字列・数値の入力を1つ求める | 入力値(キャンセルは None) | 3本 | 時間割ビューアー/カンバンボード |
インポートは from tkinter import messagebox, filedialog のように明示します。import tkinter as tk だけでは tk.messagebox は使えません。また filedialog はキャンセル時に空文字を返すため if not path: return が必要で、simpledialog は None を返すので is None で判定します。
8. 値を持つのは部品ではなく「変数クラス」
入力欄の値を扱う方法は、entry.get() で都度読む方法と、変数クラスを部品に結びつける方法の2通り。178本中131本が StringVar を使っており、後者が主流です。種類は4つで、StringVar(文字列・Label や Entry)、IntVar(整数・Radiobutton や Spinbox)、DoubleVar(小数・Scale)、BooleanVar(真偽値・Checkbutton)を使い分けます。
msg = tk.StringVar(value="待機中")
tk.Label(root, textvariable=msg).pack()
msg.set("計算しました") # ラベルの表示が自動で切り替わる
利点は、表示の更新を「変数に代入する」だけで書けることです。label.config(text=...) を呼んで回る必要がなくなり、同じ値を複数の部品へ映すのも簡単になります。カウントダウンタイマーのように毎秒表示が変わるアプリでは、読みやすさに差が出ます。なお変数クラスは tk.Tk() の後でないと作れません。
9. pack・grid・place の違いと使い分け
部品は作っただけでは画面に出ず、配置マネージャを呼んで初めて表示されます。選択肢は3つです。
| 方法 | 考え方 | 向いている画面 | 使用本数 | 実例 |
|---|---|---|---|---|
| pack() | 上から(または左から)順に詰める | 縦1列・横1行が中心の画面 | 177本 | 最初のウィンドウ |
| grid() | 行と列のマス目に置く | 入力フォーム・ボタンの格子 | 84本 | 電卓 |
| place() | 座標で直接指定する | 重ね置き・自由配置 | 6本 | デスクトップ付箋/CSVビューア |
採用率がそのまま推奨順です。基本は pack、フォームや電卓のような格子は grid、place は特殊な用途だけ。place が6本にとどまるのは、ウィンドウサイズを変えると座標指定が追従できず崩れるからです。
崩れ方の定番は「ウィンドウを広げても部品が左上に寄ったまま」で、pack なら fill="both", expand=True、grid なら sticky="nsew" と root.columnconfigure(0, weight=1) で追従します。もう1つの定番が次章の混在エラーです。
10. つまずきやすい5点(実際のエラーメッセージつき)
以下は Python 3.12.10(Tk 8.6)と Python 3.14.7(Tk 9.0)で実際に動かして確認した結果です。
10-1. pack と grid を同じ親で混ぜる
同じ Frame の中で pack と grid を併用すると、Tk 8.6 では TclError: cannot use geometry manager grid inside .!frame which already has slaves managed by pack、Tk 9.0 では cannot use geometry manager "grid" inside ".!frame": pack is already managing its content windows というエラーになります(文言はバージョンで異なります)。解決策は、混ぜたい区画ごとに Frame を分けることです。親が違えば別の配置方法を使えます。
10-2. ttk の部品に bg や fg を指定する
ttk.Button(root, text="x", bg="red") は TclError: unknown option "-bg" で失敗します。見た目を変えるなら ttk.Style() を使うか、その部品だけ tk.Button にします。178本中21本が ttk.Style を使っているのは、この制約への対応です。
10-3. 変数に代入したつもりが None になる
label = tk.Label(root, text="x").pack() と書くと label は None になります(pack() の戻り値が None のため)。後でその部品を操作するなら、生成と配置を2行に分けてください。AttributeError: 'NoneType' object has no attribute 'config' の典型的な原因です。
10-4. Text の中身を取ると改行が1つ多い
text.get("1.0", "end") は末尾に改行が付きます('abc' を入れた直後でも 'abc\n' が返ります)。文字数カウントで1文字ずれる原因になるので、text.get("1.0", "end-1c") と書きます。
10-5. Entry の値は常に文字列
entry.get() は "12" のような文字列を返します。そのまま足すと文字列連結になるため、数値として使うなら int()・float() に変換し、数字以外が入力された場合に備えて try / except ValueError で囲みます。エラーの読み方はPythonのよくあるエラー一覧へ。
11. よくある質問(FAQ)
Q. tkinter のインストールは必要ですか?
公式サイトから入れた Windows・macOS 版の Python なら標準で付属しており、追加インストールは不要です。python -m tkinter で確認用の小さなウィンドウが出れば使えます。Linux では別パッケージ(Debian 系なら python3-tk)が必要な場合があります。環境構築はPythonインストール手順へ。
Q. ウィジェットは全部で何種類ですか?
手元の Python 3.12.10 と 3.14.7 で数えると、tkinter 本体が18種類(Tk・Toplevel・基底クラスを除く)、ttk が18種類でうち6種類が ttk 固有、重複を除くと24種類です。記事ごとに「19種類」などと表記が揺れるのは、Toplevel やダイアログを数に含めるかどうかの違いです。
Q. tk と ttk はどちらを使えばよいですか?
同名の部品があるなら ttk が基本で、ttk に無い Text・Canvas・Listbox・Menu・Message・Toplevel だけ tk 系を使います。ただし色を直接指定したい学習用コードでは tk 系の手軽さが勝ちます。
Q. 表形式のデータを表示する部品はありますか?
ttk.Treeview が該当します。178本中66本が使用しており、家計簿アプリが最小構成の例です。セルを直接編集する機能は無いので、編集は別の入力欄やダイアログで受け取ります。
Q. この一覧の部品だけで実用的なアプリは作れますか?
作れます。当サイトの178本は標準ライブラリの tkinter を中心に組み立てたもので、画像処理やグラフなど専門分野に踏み込むときだけ Pillow や matplotlib を足しています。どのライブラリが何に使えるかはPythonライブラリ一覧を参照してください。
本記事は、生成AIを活用して下書きし、運営者が内容を確認・編集したうえで公開しています。AIの利用方針は免責事項をご覧ください。
12. まとめ:次に読むもの
覚えるべきは3点です。
- 部品は入力・表示・入れ物の3分類。画面の各パーツを当てはめれば使う部品は決まる
- ttk にあるものは ttk。無いのは Text ほか §2 の6つだけ
- 配置は pack が基本、格子は grid。同じ親で混ぜるとエラーなので Frame で区画を分ける
一覧を眺めるより、気になった部品を1つ選んで動かすほうが早く身につきます。決まらない場合は初心者向けGUIアプリを難易度順に上から、実用ツールを作りたい方は中級者向けをどうぞ。学ぶ順番に迷っているなら入門書を終えたら次に作るもの、部品を組み合わせて1本の実用アプリに仕上げる過程はtkinterで画像編集アプリを作るが具体例になります。
体系立てた土台も欲しくなったらPython入門書のおすすめ2冊も選択肢です(書籍紹介ページにはアフィリエイト広告を含みます)。tkinter 専門書ではありませんが、どちらも GUI の章を持っています。
ウィジェット構成は Python 公式ドキュメント(3.13・日本語版)の tkinter/tkinter.ttk/tkinter.scrolledtext と、手元の Python(3.12.10 / Tk 8.6、3.14.7 / Tk 9.0)での実行結果で確認しました。