MENU

【GUIライブラリの選び方】tkinter・PySimpleGUI・Streamlitを同じアプリで比較

バイブコーディングで自分用のツールを作るとき、最初に迷うのが「画面(GUI)をどう作るか」です。Pythonには画面を作る部品(GUIライブラリ)がいくつもあって、AIに「画面を付けて」と頼めば、どれを使ってでも作れてしまいます。だからこそ、選び方を知らないまま進めると、後から「これでは配れない」「この表示はできなかった」と詰まることがあります。

目次

1. 結論:GUIは「誰が・何人で使うか」で決まる

先に結論からお伝えします。現場で自作ツールを作る人にとって現実的な選択肢は3つ。そして、どれを選ぶかは機能の多さではなく、「誰が・何人で使い、どう配るか」でほぼ決まります。まずは自分の用途から、この早見表で当たりをつけてください。

スクロールできます
こういう人にこれひとことで言うと
自分だけで使う・人に渡したいtkinterPython標準・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つを並べると、非対称がはっきりします。冒頭の早見表に、配布や可視化、つまずきどころまで足した詳細版がこちらです。

スクロールできます
観点tkinterPySimpleGUIStreamlit
向く人数自分〜同PC数人自分〜同PC数人社内で共有
配布exe化しやすいexe化しやすい(商用は要ライセンス)サーバーが要る
表・グラフ苦手(部品追加)苦手(部品追加)得意(部品の範囲で)
自由なUI何でも組める(全部自分で)何でも組める(全部自分で)部品がないと詰まる
見た目の整えやすさ素朴(自分で調整)テーマ機能で整う標準できれい
つまずきどころ表示の作り込み公式版のライセンス登録部品の外・再実行・サーバー

言いたいことは一つです。Streamlitはデータ表示では数行で勝つが「部品があること」が前提で、外れた瞬間に急に書けなくなる。tkinterは表示は地味で手間もかかるが、何でも自分で組める代わりに、全部自分で組む必要がある。PySimpleGUIは書き味はtkinterと同等で、見た目を少し整えやすいのが利点。ただし公式版は有償ライセンスが要ります。どれが優れているかではなく、用途のどこに重心があるかで答えが変わります。

4. まとめ:あなたのケースはどれか

結論に戻ります。用途から逆引きすると、こうなります。

  • 自分だけ・人に渡したい・入力とボタン中心 → tkinter(exe化して配れる)
  • tkinterで作るが、見た目を少し整えたい → PySimpleGUI(書き味は同等・テーマ機能で見栄えが出る。ただし商用版は有償ライセンス)
  • 社内で共有・表やグラフを見せたい・凝った画面は要らない → Streamlit

迷ったら、まず「何人で使い、どう配るか」に戻ってください。そこが決まれば、3つのうちどれかは自然に消えます。そして、最初に作るものは小さく。小さく作って、足りなければ作り直せるのが、バイブコーディングの強みです。最初から全部を満たそうとして重いものを選ぶより、用途に合った軽いもので一度動かしてみるほうが、結局は早く着地します。

このツールは自分で作る?プロに頼む?

自分のPCや社内の数人で使う道具なら、ここで挙げた3つで自作できます。一方、社外の不特定多数に常時公開する・ログインやお金の処理が絡む、となると、画面の話だけでは済まなくなります。そこは無理に自作せず、専門家に任せるほうが安全で、結局は早いことが多いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次