Python GUIライブラリ5つを比較|おすすめの選び方と2026年の現状
tkinter は古いのか、PySimpleGUI は有料のままなのか。5つのライブラリで同じ小アプリを書いて動かし、ライセンスと配布の注意までまとめました。作りたいものから1つに決められます。
1. 結論:迷ったら tkinter、乗り換えは3つのサインで
最初の1本は tkinter で十分です。Python 本体に同梱されていて(python.org の従来型インストーラーでは既定で入ります)、追加インストールなしで今日から書けます。社内の数人が使う小さな道具なら、最後まで tkinter のままで困らないことも多いです。
乗り換えを考えるのは、次のどれかに当てはまったときです。
- ダークモードや今風の見た目を求められた → CustomTkinter(書き方は tkinter とほぼ同じ)
- 表・グラフ・タブが並ぶ業務アプリを他人に配る → PySide6(部品が豊富。容量とライセンスの理解が要る)
- 同じ画面をブラウザでも出したい → Flet(2026年9月に1.0へ到達)
PySimpleGUI は、2024年に有料化されたあと2026年に LGPLv3 の v6 が出て、今は無料で入ります。ただ作者自身が将来の見通しを「わからない」と書いているため、新しく採用するかは §4 を読んでから決めてください。
2. 5ライブラリの早見表
版とライセンスは 2026-09-28 時点で PyPI・公式リポジトリを確認した値です。
| ライブラリ(版) | ライセンス | 追加インストール | 見た目 | exe 化 | 学習の入口 | 向く用途 |
|---|---|---|---|---|---|---|
| tkinter(Python 同梱) | PSF+Tcl/Tk(BSD 系) | 不要 | 素朴 | PyInstaller(当サイト実測あり) | 標準・日本語の公式ドキュメントあり | 最初の1本・社内ツール |
| CustomTkinter 6.0.0 | MIT | 必要(小さい) | モダン・ダーク対応 | 公式 Wiki は onedir を案内 | tkinter の知識がそのまま使える | tkinter の見た目を今風に |
| PySide6 6.11.2 | LGPLv3/GPL/商用 | 必要(大きい) | OS に近い・部品が豊富 | 公式は pyside6-deploy を推奨 | Qt の仕組み(シグナル等)を覚える | 配布する本格業務アプリ |
| Flet 1.0.1 | Apache-2.0 | 必要(初回に本体取得) | Flutter の部品 | flet build(要 Visual Studio)/flet pack | 0.x 時代の記事に注意 | Web・スマホにも広げたい |
| PySimpleGUI 6.3.0.1 | LGPLv3 | 必要(小さい) | tkinter ベース | 当サイト未検証 | レイアウトをリストで書く独自方式 | 既存コードの保守 |
インストールの重さは PySide6 だけ桁が違います。PyPI の wheel を合計すると約247MB(2026-09-28 時点の概算)です。CustomTkinter・Flet・PySimpleGUI の本体 wheel は1MB未満です(Flet は初回起動時に別途本体を取得・§6)。社内 PC のようにダウンロードや容量に制限がある環境では、これだけで選択肢から外れることがあります。
exe 化(Python の無い PC で動かせる形にすること)の手順と、tkinter だけのアプリで onefile が約9.9MB になった実測はPyInstaller の実測ガイドが詳しいです。
ボタンの裏で動かす Excel・PDF の自動化から、作ったツールを同僚の PC に渡す exe 化(12章)までを1冊で通して学ぶなら、『退屈なことはPythonにやらせよう 第3版』の紹介欄が参考になります。リンク先は当サイトの書籍紹介ページで、アフィリエイト広告を含みます。
3. 同じ小アプリを5つで書いて動かした
題材は「名前を入れてボタンを押すと、あいさつが表示される」アプリです。入力欄・ボタン・ラベルの3部品とクリック処理という、どの GUI でも最初に書く形にそろえました。
Windows 11(ビルド 26200)・Python 3.12.10(tkinter は Tk 8.6.15)・PySide6 6.11.2・Flet 1.0.1(flet-desktop 1.0.1)・CustomTkinter 6.0.0・PySimpleGUI 6.3.0.1。仮想環境に PyPI から pip install し、5本とも起動→入力→ボタン→表示までを確認しました。
| ライブラリ | 行数(空行を除く) | 起動の参考値 | インストール後の容量 |
|---|---|---|---|
| tkinter | 12行 | 0.15秒 | 0(同梱) |
| CustomTkinter | 11行 | 0.30秒 | 約1.6MB |
| PySimpleGUI | 14行 | 0.42秒 | 約3.4MB |
| PySide6 | 15行 | 0.25秒 | 約666MB |
| Flet | 9行 | 0.64秒 | 約4.1MB+初回取得の本体 約101MB |
起動の参考値は、スクリプト開始からイベントループが最初の処理を始めるまでを3回測った中央値です(事前に1回実行済み)。画面の描画が終わる瞬間ではないため、この環境での目安として見てください。容量はインストールされたフォルダの実測値で、PySide6 は PySide6・shiboken6 の合計、ほかは本体のみ(小さな依存パッケージは含みません)です。
起動はどれも1秒未満(Flet の初回を除く)、行数も5本とも15行以内でした。差が出るのは行数より「部品をどう並べるか」の考え方で、以下のコードで見比べられます。
tkinter:部品を作って pack で並べる
import tkinter as tk
from tkinter import ttk
def greet():
label.config(text=f"こんにちは、{entry.get()}さん") # 例: こんにちは、太郎さん
root = tk.Tk()
root.title("あいさつ")
entry = ttk.Entry(root)
entry.pack(padx=20, pady=5)
ttk.Button(root, text="あいさつ", command=greet).pack(pady=5)
label = ttk.Label(root, text="")
label.pack(pady=5)
root.mainloop()
部品の種類と使い分けはtkinterウィジェット一覧、ウィンドウを出すところから始めるならtkinterで最初のウィンドウへ。
CustomTkinter:tkinter の部品名に CTk を付けて書く
import customtkinter as ctk
def greet():
label.configure(text=f"こんにちは、{entry.get()}さん") # 例: こんにちは、太郎さん
app = ctk.CTk()
app.title("あいさつ")
entry = ctk.CTkEntry(app, placeholder_text="名前")
entry.pack(padx=20, pady=5)
ctk.CTkButton(app, text="あいさつ", command=greet).pack(pady=5)
label = ctk.CTkLabel(app, text="")
label.pack(pady=5)
app.mainloop()
ttk の import 以外は tkinter 版と1行ずつ対応します。ただし CTk の部品に config() は無く(呼ぶと AttributeError)、configure() で書きます。入力欄の薄い案内文(placeholder_text)は tkinter の Entry には無い機能です。
PySimpleGUI:画面をリストで描き、while で待つ
import PySimpleGUI as sg
layout = [
[sg.Input(key="-NAME-")],
[sg.Button("あいさつ")],
[sg.Text("", size=(30, 1), key="-OUT-")],
]
window = sg.Window("あいさつ", layout)
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
if event == "あいさつ":
window["-OUT-"].update(f"こんにちは、{values['-NAME-']}さん") # 例: こんにちは、太郎さん
window.close()
リストの1要素が画面の1行になります。関数を登録する代わりに while でイベントを受け取る書き方で、ここが他の4つと違います。
PySide6:レイアウトに部品を足し、シグナルをつなぐ
import sys
from PySide6.QtWidgets import (QApplication, QWidget, QVBoxLayout,
QLineEdit, QPushButton, QLabel)
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("あいさつ")
entry = QLineEdit()
button = QPushButton("あいさつ")
label = QLabel("")
layout = QVBoxLayout(window)
for w in (entry, button, label):
layout.addWidget(w)
button.clicked.connect(lambda: label.setText(f"こんにちは、{entry.text()}さん")) # 例: こんにちは、太郎さん
window.show()
sys.exit(app.exec())
clicked.connect() が Qt の「シグナル」で、ボタンが押された知らせを関数に結びます。5本の中で行数は最多です。
Flet:main 関数でページに部品を足す
import flet as ft
def main(page: ft.Page):
page.title = "あいさつ"
name = ft.TextField(label="名前")
out = ft.Text()
def greet(e):
out.value = f"こんにちは、{name.value}さん" # 例: こんにちは、太郎さん
page.add(name, ft.Button(content="あいさつ", on_click=greet), out)
ft.run(main)
行数は最少で、page.add() に渡した順に縦へ並びます。起動の書き方は 1.0.1 で動作確認した ft.run(main) です。0.x 時代の記事とは書き方が違う箇所があるので、コピーするときは版を確かめてください(§6)。
4. PySimpleGUI は有料化から LGPLv3 に戻った
「PySimpleGUI は有料になった」という情報は、2024〜2025年の時点では正しく、2026年の今は古くなっています。公式 README と PyPI で確認できた流れは次のとおりです。
- 2024年2月:v5 で商用化。ライセンスキーを使う方式になった
- 2025年2月:開発元 PySimpleSoft が事業終了を告知(サポートは2025年末まで)
- 2026年4月:v5 のコードからライセンスとセキュリティの部品を外し、LGPLv3 の v6 として公開
- 2026-09-28 時点:
pip install PySimpleGUIで入るのは 6.3.0.1(2026-08-16)
PyPI では v5 系(5.0.8.2・5.0.8.3)が yanked(取り下げ)扱いになり、通常の pip install では選ばれません。v4 最後のオープンソース版 4.60.5 は、2026-04-03 に 4.60.5.1 として再アップロードされています。実際に PyPI から入れた 6.3.0.1 は、キーの入力なしで §3 のコードが動きました。
ネット上の古い記事にある「専用サーバーを --extra-index-url で指定する」手順は v5 期の案内なので、今は不要です。一方で、v5 のキーが今も有効か、その専用サーバーが動いているかは確認できませんでした。
注意したいのは将来性です。README には作者自身の言葉で「長期的な将来がどうなるかは正直わからない」とあります。手元に PySimpleGUI のコードがあるなら v6 で使い続けられますが、新しく始めるなら tkinter か CustomTkinter の方が説明のつく選択です。
出典:PySimpleGUI 公式リポジトリ/PyPI(2026-09-28 確認)
5. PySide6 は LGPL の条件を読んでから配る
PySide6(Qt for Python)は LGPLv3・GPLv2・GPLv3 と、Qt 社の商用ライセンスから選べます。気をつけるのは主に、作ったアプリをソースを公開せずに他人へ配るときです。
Qt 公式の「LGPL の義務」ページによると、動的リンクであれば自作部分のソースを非公開にできます。ただし次の条件が付きます。
- 利用者が Qt のライブラリを差し替えて、アプリを動かせること(そのための情報の提供を含む)
- 使った Qt ライブラリのソース(手を加えたならその変更も)を渡せること
- LGPL の本文を利用者に渡し、目立つ形で通知を表示すること
- 静的リンクにすると、アプリ本体にも LGPL が及ぶ可能性があること
さらに Qt の一部モジュールは GPLv3 か商用ライセンスでしか使えません。対象は Qt の版で変わるので、Qt の Licensing ページで使うモジュールを確かめてください。商用版とコミュニティ版を同じプロジェクトで混ぜることも、Qt 公式が認めていません。
PyInstaller の onefile で1ファイルに固めた場合に「差し替えられること」を満たすかは、一次情報で結論を確認できませんでした。本記事は法的な助言ではありません。業務で配布する場合はQt 公式の LGPL 義務のページを読み、必要に応じて専門家に確認してください。
もう1点、検証に使った PySide6 6.11.2 が対応する Python は 3.10 以上 3.15 未満です。Python 3.15 は2026年10月9日にリリースされました。10月8日公開の PySide6 6.12.0 は対応範囲が 3.16 未満に広がっています(2026年10月12日時点・PyPI。3.15 での動作は当サイト未確認)。3.15 で使う場合は 6.12.0 以降が対象です。
6. Flet と CustomTkinter が向く人
Flet:Web やスマホにも広げたい人
Flet は Flutter を土台にしたライブラリで、2026-09-14 に 1.0.0、2026-09-22 に 1.0.1 が出ました。公式ブログは 0.28 から 1.0 への移行を非互換の大きい変更としており、イベント処理がアプリのイベントループ上で動く方式に変わっています。0.x 時代の記事のコードは、そのままでは動かないことがあると考えてください。
手元では、初回の起動時だけ「Preparing Flet v1.0.1 for the first use」と表示され、デスクトップ用の本体(展開後 約101MB)を取得しました。初回の実行は約14秒かかりました(取得と展開を含むため、回線で変わります)。公式の告知でも、初回実行時に GitHub Releases から取得する仕様とされています。社内プロキシや閉域網でどう動くかは検証していません。
なお pip install flet だけでは flet-desktop は入りませんでした。ソースを見ると、無い場合は初回実行時に pip で自動インストールする作りです(公式のインストール手順は pip install "flet[all]")。
Android・iOS・Web 向けのビルドも公式に用意されていますが、当サイトでは試していません。スマホアプリを本格的に作る場合、Python は本流の選択肢ではない点はPythonが不得意なもので整理しています。日本語入力では、土台の Flutter に「Windows の日本語 IME で文字が重複する」Issue が未解決のまま残っています(Flet 1.0.1 で再現するかは未検証)。
exe にするなら flet build windows が主な方法です。Windows 上でしか実行できず、Visual Studio の「C++ によるデスクトップ開発」が必要になります。PyInstaller ベースで手軽な flet pack もあります。
CustomTkinter:tkinter のまま見た目を今風にしたい人
CustomTkinter は tkinter の上に作られたライブラリで、ライセンスは MIT です。ダーク/ライトモードや高解像度ディスプレイへの対応を README でうたっています。tkinter で1本作った人が見た目だけ変えたいときに向きます。
最新の 6.0.0(2026-06-24)は、前の 5.2.2 から約2年5か月ぶりのリリースでした。6.0.0 ではボタンの command が「マウスボタンを離したとき」に動くよう変わっています。exe 化について公式 Wiki は、データファイルを含むため onefile ではなく onedir と --add-data での同梱を案内しています(現行版での onefile の可否は未検証)。
7. 作りたいものから選ぶ
上から順に当てはめ、最初に「はい」になったものを選びます。
- GUI を作るのが初めて → tkinter。追加インストールが要らず、つまずいたときの情報も見つけやすい
- tkinter で作ったアプリの見た目を変えたい → CustomTkinter。部品名を置き換え、config や bg・fg などの指定を CTk 流に直して移せる
- 表やグラフの多い業務アプリを他人に配る → PySide6。§5 のライセンス条件と容量を受け入れられるなら
- 同じ画面をブラウザでも使いたい → Flet。ただ「データを表とグラフで見せたい」だけなら、GUI ライブラリではなく Streamlit でブラウザに出す方法もある
- PySimpleGUI で書いたコードが手元にある → v6 で継続。新規なら上の4つから選ぶ
どれにも当てはまらず迷うなら tkinter で1本作ってみてください。「ここが足りない」が具体的にわかれば、乗り換え先も §2 の早見表から決まります。
8. よくある質問(FAQ)
Q. PySimpleGUI は今も有料ですか?
2026-09-28 時点では無料で使えます。2026年4月に LGPLv3 の v6 が公開され、pip install PySimpleGUI で入る 6.3.0.1 はライセンスキー不要です。ライセンスキーが必要で商用利用は有料だったのが2024年2月からの v5 系で、PyPI では取り下げ済みです。
Q. tkinter は古いので避けた方がいいですか?
学習や社内ツールなら避ける理由はありません。Python 本体と一緒に更新されており、手元の Windows では Python 3.12.10 に Tk 8.6.15、Python 3.14.7 に Tk 9.0.4 が入っていました。見た目が素朴なのは事実なので、気になったら CustomTkinter に移れます。
Q. 会社で配るツールに使っても問題ありませんか?
tkinter(PSF と Tcl/Tk の BSD 系ライセンス)、CustomTkinter(MIT)、Flet(Apache-2.0)は、著作権表示などの条件を守れば商用利用も認められています。PySide6(GPL・商用も選択可)と PySimpleGUI は LGPLv3 なので、ソースを公開せずに配るなら LGPL の条件を確認してください(§5 は Qt の例)。本記事は法的な助言ではありません。
Q. Flet ならスマホアプリも作れますか?
公式には Android・iOS 向けのビルドが用意されていますが、当サイトでは検証していません。スマホアプリを本格的に作るなら Swift・Kotlin・Flutter が本流で、Python は実用レベルでは向いていません。スマホ対応を主な理由に Flet を選ぶのは避け、デスクトップや Web が主の場合に検討してください。
本記事は、生成AIを活用して下書きし、運営者が内容を確認・編集したうえで公開しています。AIの利用方針は免責事項をご覧ください。
9. まとめ:次に読むもの
- 迷ったら tkinter。見た目なら CustomTkinter、配布する本格アプリなら PySide6、Web にも広げるなら Flet
- PySimpleGUI は v6 で LGPLv3 に戻り無料。ただし新規採用は将来性込みで判断
- PySide6 を配るときは LGPL の条件と、約247MB(wheel 合計)の重さを先に確認
当サイトの GUI アプリは 2026-09-28 時点で178本あり、すべて tkinter で作っています。電卓や ToDo のような小物から、ローカル LLM と話すチャット画面やSQLite を使う配当金管理ツールまで、tkinter でどこまで作れるかの実例として使ってください。一覧は初心者向け GUI アプリ集と中級者向け GUI アプリ集にあります。作ったアプリを配るときはPyInstaller での exe 化へ。
版・ライセンスは PyPI の各パッケージページ(PySide6/flet/customtkinter/PySimpleGUI)、Flet 1.0 公式ブログ、CustomTkinter 公式 Wiki、Qt for Python の配布ドキュメントで確認しました。行数・起動時間・容量は、上記の実行確認環境で測った値です。