バイブコーディングで自分用のツールを作るとき、最初に迷うのが「画面(GUI)をどう作るか」です。Pythonには画面を作る部品(GUIライブラリ)がいくつもあって、AIに「画面を付けて」と頼めば、どれを使ってでも作れてしまいます。だからこそ、選び方を知らないまま進めると、後から「これでは配れない」「この表示はできなかった」と詰まることがあります。
1. 結論:GUIは「誰が・何人で使うか」で決まる
先に結論からお伝えします。現場で自作ツールを作る人にとって現実的な選択肢は3つ。そして、どれを選ぶかは機能の多さではなく、「誰が・何人で使い、どう配るか」でほぼ決まります。まずは自分の用途から、この早見表で当たりをつけてください。
| こういう人に | これ | ひとことで言うと |
|---|---|---|
| 自分だけで使う・人に渡したい | tkinter | Python標準・exe化して配れる |
| tkinterで見た目を整えたい人 | PySimpleGUI | 書き味は同等・見た目は整えやすい。商用版は要ライセンス |
| 社内で共有・表やグラフを見せたい | Streamlit | データ表示が得意・ブラウザで開く |
この記事では、なぜ用途で候補をしぼり、同じアプリを3つを比較した結果を順に見ていきます。最後にもう一度、用途別の選び方をまとめます。
2. 理由:機能ではなく「人数と配り方」で絞れる
GUIライブラリを選ぶとき、見た目や機能から考え始めると迷子になります。先に決めるべきは、次の3つの問いです。特に最初の2つで、選択肢はほとんど絞られます。
- 何人で使うか … 自分だけか、同じPCを使う数人か、社内の不特定多数か
- どう配るか … 自分のPCで動けばいいか、人に渡して使ってもらうか
- 何を見せたいか … ボタンと入力で足りるか、表やグラフをきれいに見せたいか
「機能が多いから良い」ではありません。たとえば社内の大勢に使ってもらうなら、画面の自由度より「ブラウザで開けること」のほうが大事になります。逆に自分専用の小さな道具なら、配布のしやすさが効いてきます。目的が決まれば、ツールは後から決まります。
3. 具体例:3つの特徴と、作って分かった強み・弱み
まず3つがそれぞれ何者かを一言で。得意なことと、その裏にある苦手なことをセットで押さえます。
tkinter ─ Pythonに最初から入っている、堅実な定番
Pythonに標準で同梱されているので、追加インストールが要りません。単純な入力欄とボタンの画面なら手早く作れ、exe化(人に渡せる形にすること)もしやすい。ただし、表やグラフをきれいに見せるのは苦手で、そこをやろうとすると別の部品(matplotlibなど)を自分で組み込む必要があります。
PySimpleGUI ─ 書き味は同等、見た目は少し整えやすい
tkinterを内部で使っているライブラリで、書き味そのものはtkinterと同等です。違いが出るのは見た目で、テーマ機能(配色を一語で切り替えられる)があり、細かく整えなくても、素のtkinterより少しきれいな画面になりやすいのが利点です。ただし最大の難点はライセンスで、公式版はバージョン5以降が有償化され、商用利用にはライセンスキーが必要になりました。見た目を取るか、ライセンスの手間を避けてtkinterのままいくか、という選び方になります。
Streamlit ─ 表やグラフを、数行で見せられる
データを表やグラフで見せるのが得意で、ブラウザで開く画面が数行で作れます。社内の複数人に共有したいときに強い。ただし注意点が2つあって、ここが後で効いてきます。
一つは、用意された部品がある表示は一瞬だが、部品がない表現は急に難しくなること。決まった形のグラフや表はあっという間ですが、細かいレイアウトや独自の画面を作ろうとすると、とたんに手が止まります。クライアント・サーバーシステムで動きます。ただ本当にサーバーが必要というわけではなく、自分のPCがサーバーとクライアント(ブラウザ)を兼ねて動く形なので、自分用に立ち上げる分には1コマンドで済みます。社外の人に常時公開する、となると話が変わってきます。
画面を配る役がサーバー、受け取って表示する役がブラウザ(クライアント)です。自分のPCで動かすときは、1台がその両方を兼ねます。仕組みは別記事で詳しく扱います。
同じアプリを3つで作って比べる
同じお題を3つそれぞれで作ってみました。「在庫CSVを読み込んで、表で見せて、棒グラフも出す」──入力・表・グラフという、得意不得意が分かれる3要素を含んだお題です。
tkinter
tkinterは、CSVを読むところまでは問題ありません。表はTreeviewという部品で列を一つずつ定義し、グラフはmatplotlibを別途埋め込む必要があります。「全部自分で組める」は「全部自分で組む必要がある」と同じ意味で、表やグラフの描画のコード量はそこそこ多くなります。できあがったものはexe化して同僚にそのまま渡せます。
tkinterのコードを見る(表+グラフ)
import tkinter as tk
from tkinter import ttk
import matplotlib
import pandas as pd
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
# 日本語フォントを明示設定。これが無いと棒グラフの品名ラベルが文字化け(豆腐)する。
matplotlib.rcParams["font.family"] = "MS Gothic"
# --- データ読み込み(同フォルダの inventory.csv / UTF-8) ---
df = pd.read_csv("inventory.csv", encoding="utf-8")
# --- ウィンドウ ---
root = tk.Tk()
root.title("在庫ビューア(tkinter)")
# --- 表(ttk.Treeview): CSVの列を見出しにして全行を入れる ---
table = ttk.Treeview(root, columns=list(df.columns), show="headings", height=len(df))
for col in df.columns:
table.heading(col, text=col)
table.column(col, width=120, anchor="center")
for _, row in df.iterrows():
table.insert("", "end", values=list(row))
table.pack(padx=10, pady=(10, 5), fill="x")
# --- 棒グラフ(matplotlib Figure を埋め込み): 横軸=品名・縦軸=在庫数 ---
fig = Figure(figsize=(6, 3.2), dpi=100)
ax = fig.add_subplot(111)
ax.bar(df["品名"], df["在庫数"], color="#4C72B0")
ax.set_xlabel("品名")
ax.set_ylabel("在庫数")
ax.set_title("品名別の在庫数")
fig.tight_layout()
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack(padx=10, pady=(5, 10))
root.mainloop()

PySimpleGUI
PySimpleGUIも、書く手間はtkinterと同じくらいです。表はsg.Tableで少しだけ短く書け、グラフは結局matplotlibを画像にして貼る流れなので、今回のお題ではコード量の差はほとんど出ません。違いが見えるのは見た目で、テーマ機能を使うと素のtkinterより整った印象になります。ただし、公式版は有償ライセンスが必要な点が、tkinterに対する明確なマイナスです。
PySimpleGUIのコードを見る(表)
import io
import FreeSimpleGUI as sg # 公式なら: import PySimpleGUI as sg(ライセンス登録が必要)
import matplotlib
import pandas as pd
from matplotlib.figure import Figure
# 日本語フォントを明示設定。これが無いと棒グラフの品名ラベルが文字化け(豆腐)する。
matplotlib.rcParams["font.family"] = "MS Gothic"
# --- データ読み込み(同フォルダの inventory.csv / UTF-8) ---
df = pd.read_csv("inventory.csv", encoding="utf-8")
def make_bar_png(dataframe):
"""棒グラフ(横軸=品名・縦軸=在庫数)をPNGバイト列として生成する。"""
fig = Figure(figsize=(6, 3.2), dpi=100)
ax = fig.add_subplot(111)
ax.bar(dataframe["品名"], dataframe["在庫数"], color="#4C72B0")
ax.set_xlabel("品名")
ax.set_ylabel("在庫数")
ax.set_title("品名別の在庫数")
fig.tight_layout()
buf = io.BytesIO()
fig.savefig(buf, format="png")
return buf.getvalue()
# --- 画面構成: 表(sg.Table)+ グラフ画像(sg.Image) ---
layout = [
[sg.Text("在庫ビューア(PySimpleGUI / FreeSimpleGUI)", font=("", 12, "bold"))],
[sg.Table(
values=df.values.tolist(),
headings=list(df.columns),
auto_size_columns=False,
col_widths=[12, 8, 8],
justification="center",
num_rows=len(df),
key="-TABLE-",
)],
[sg.Image(data=make_bar_png(df), key="-CHART-")],
[sg.Button("閉じる")],
]
window = sg.Window("在庫ビューア(PySimpleGUI)", layout, finalize=True)
while True:
event, _ = window.read()
if event in (sg.WIN_CLOSED, "閉じる"):
break
window.close()
Streamlit
Streamlitは、表もグラフも本当に数行で出ます。このお題ではStreamlitが圧勝に見えます。用意された部品にハマる表示なら、これ以上ない速さです。ただし前述のとおり、ここが落とし穴でもあります。st.bar_chartのような部品があるものは一瞬ですが、「グラフの一部だけ色を変えたい」「画面を独自のレイアウトにしたい」といった、部品から外れた要求になると、とたんに調べ物が増えて手が止まります。速いのは「部品がある範囲」だけだと知っておくと、期待外れを避けられます。
Streamlitのコードを見る(表+グラフ)
import pandas as pd
import streamlit as st
# --- データ読み込み(同フォルダの inventory.csv / UTF-8) ---
df = pd.read_csv("inventory.csv", encoding="utf-8")
st.title("在庫ビューア(Streamlit)")
# 表: CSVの全行・全列をそのまま表示
st.dataframe(df)
# 棒グラフ: 横軸=品名・縦軸=在庫数
st.bar_chart(df, x="品名", y="在庫数")

強み・弱みを一枚にすると
3つを並べると、非対称がはっきりします。冒頭の早見表に、配布や可視化、つまずきどころまで足した詳細版がこちらです。
| 観点 | tkinter | PySimpleGUI | Streamlit |
|---|---|---|---|
| 向く人数 | 自分〜同PC数人 | 自分〜同PC数人 | 社内で共有 |
| 配布 | exe化しやすい | exe化しやすい(商用は要ライセンス) | サーバーが要る |
| 表・グラフ | 苦手(部品追加) | 苦手(部品追加) | 得意(部品の範囲で) |
| 自由なUI | 何でも組める(全部自分で) | 何でも組める(全部自分で) | 部品がないと詰まる |
| 見た目の整えやすさ | 素朴(自分で調整) | テーマ機能で整う | 標準できれい |
| つまずきどころ | 表示の作り込み | 公式版のライセンス登録 | 部品の外・再実行・サーバー |
言いたいことは一つです。Streamlitはデータ表示では数行で勝つが「部品があること」が前提で、外れた瞬間に急に書けなくなる。tkinterは表示は地味で手間もかかるが、何でも自分で組める代わりに、全部自分で組む必要がある。PySimpleGUIは書き味はtkinterと同等で、見た目を少し整えやすいのが利点。ただし公式版は有償ライセンスが要ります。どれが優れているかではなく、用途のどこに重心があるかで答えが変わります。
4. まとめ:あなたのケースはどれか
結論に戻ります。用途から逆引きすると、こうなります。
- 自分だけ・人に渡したい・入力とボタン中心 → tkinter(exe化して配れる)
- tkinterで作るが、見た目を少し整えたい → PySimpleGUI(書き味は同等・テーマ機能で見栄えが出る。ただし商用版は有償ライセンス)
- 社内で共有・表やグラフを見せたい・凝った画面は要らない → Streamlit
迷ったら、まず「何人で使い、どう配るか」に戻ってください。そこが決まれば、3つのうちどれかは自然に消えます。そして、最初に作るものは小さく。小さく作って、足りなければ作り直せるのが、バイブコーディングの強みです。最初から全部を満たそうとして重いものを選ぶより、用途に合った軽いもので一度動かしてみるほうが、結局は早く着地します。
自分のPCや社内の数人で使う道具なら、ここで挙げた3つで自作できます。一方、社外の不特定多数に常時公開する・ログインやお金の処理が絡む、となると、画面の話だけでは済まなくなります。そこは無理に自作せず、専門家に任せるほうが安全で、結局は早いことが多いです。

コメント