Pythonの標準GUIライブラリをより美しく:Tkinter-ttkの基礎から応用まで
![]()
【Yuki】
Hirokiくん、こんにちは。今日はPythonでデスクトップアプリを作る際にとても便利な「Tkinter-ttk」についてお話ししようと思います。以前、基本的なTkinterについては少し触れたことがあったかもしれませんが、その進化系のようなものだと考えてもらえるといいかもしれません……。
![]()
【Hiroki】
Yukiさん、こんにちは!はい、Tkinterで簡単なウィンドウを出したことはあります。でも、なんだか見た目が少し古いというか、昔のOSのような感じがしてしまって……。もっと今風の綺麗なボタンや部品を使いたいなと思っていたんです。それが「ttk」なんですか?
![]()
【Yuki】
そうですね、まさにHirokiくんが感じた「見た目の古さ」を解決するために導入されたのがttk(Tk Themed widgets)なんです。Python 2.7や3.1から標準ライブラリに追加されたもので、従来のTkinterよりも「モダンな外観」と「コードの柔軟性」を両立させているんですよ。
![]()
【Hiroki】
モダンな外観!それは楽しみです。具体的に普通のTkinterとは何が違うんでしょうか?
![]()
【Yuki】
大きな違いは、「ウィジェットのロジック」と「見た目(スタイル)」が分離されていることだと思います。従来のTkinterは、ボタンの背景色やフォントをボタンそのものの設定として書き込んでいました。でもttkでは、「スタイル」という仕組みを使って、見た目を一括管理できるようになっているんです。これにより、OSごとのネイティブな見た目に近づけることも可能になります。
Tkinter-ttkの導入と基本的な構成
![]()
【Hiroki】
なるほど、見た目の管理がしやすくなっているんですね。さっそく使ってみたいです!どうやってインポートすればいいんですか?
![]()
【Yuki】
まずは、通常のTkinterと一緒にttkをインポートするところから始めます。以下のような書き方が一般的だと思います……。
import tkinter as tk
from tkinter import ttk
# メインウィンドウの作成
root = tk.Tk()
root.title("ttkのテスト")
root.geometry("400x300")
# 通常のTkinterボタン
button_std = tk.Button(root, text="通常のボタン")
button_std.pack(pady=10)
# ttkのボタン
button_ttk = ttk.Button(root, text="ttkのボタン")
button_ttk.pack(pady=10)
root.mainloop()
![]()
【Hiroki】
あ、from tkinter import ttkが必要なんですね。実行してみると、確かに「ttkのボタン」の方が少し立体的だったり、マウスを乗せた時の反応が今風な感じがします!
![]()
【Yuki】
そう言ってもらえると嬉しいです。ttkを使う際は、ウィジェットを作成するときに tk.Button ではなく ttk.Button のように、頭に「ttk.」を付けて呼び出すのがルールですね。
スタイル(ttk.Style)による一括管理
![]()
【Hiroki】
さっき「見た目とロジックの分離」と言っていましたが、具体的にどうやって色や形を変えるんですか?
![]()
【Yuki】
そこがttkの少し難しい、けれど便利なところです。ttk.Style クラスを使います。例えば、すべてのボタンの色を一気に変えたいときは、以下のように設定できるかもしれません。
style = ttk.Style()
# テーマの確認
print(style.theme_names())
# テーマを「clam」に変更してみます
style.theme_use('clam')
# ボタンのスタイルをカスタマイズ
style.configure("TButton", foreground="blue", font=("MS Gothic", 12))
![]()
【Hiroki】
TButton というのが、ttkのボタン全体を指すキーワードなんですね。
![]()
【Yuki】
その通りです。これを「スタイル名」と呼びます。もし、特定のボタンだけ別のデザインにしたい場合は、自分で新しい名前を作ることもできるんですよ。例えば "My.TButton" のように名前を付けて、ウィジェット作成時に style="My.TButton" と指定すれば、特定の部品だけに適用されます。少し控えめに個性を出したいときに便利かもしれません……。
![]()
【Hiroki】
特定の部品だけ変えられるのはいいですね。ところで、theme_use って何ですか?
![]()
【Yuki】
ttkには「テーマ」という概念があります。OS標準のような default、少しフラットな clam、クラシックな alt など、いくつかのセットが用意されています。これらを切り替えるだけで、アプリ全体の雰囲気をガラッと変えることができるんです。
高機能なウィジェット:Treeview
![]()
【Hiroki】
ボタン以外にも、ttkにしかない便利な部品はあるんでしょうか?
![]()
【Yuki】
はい、実はttkを使う最大のメリットの一つに、「Treeview(ツリービュー)」というウィジェットがあります。これは表形式でデータを表示したり、ファイルマネージャーのように階層構造を表示したりするのに非常に優れているんです。
![]()
【Hiroki】
表が作れるんですか!それは便利そうです。どうやって書くんですか?
![]()
【Yuki】
少しコードが長くなりますが、基本的な構造はこんな感じになると思います。
# Treeviewの作成
tree = ttk.Treeview(root, columns=("Age", "Language"), show="headings")
# 各列のヘッダー(見出し)を設定
tree.heading("Age", text="年齢")
tree.heading("Language", text="得意な言語")
# 列の幅や配置を設定
tree.column("Age", width=100, anchor="center")
tree.column("Language", width=200, anchor="w")
# データの挿入
tree.insert("", "end", values=("17", "Python"))
tree.insert("", "end", values=("22", "JavaScript"))
tree.pack(padx=10, pady=10)
![]()
【Hiroki】
すごい!ちゃんとしたリスト形式になりました。これ、データベースの中身を表示したりするのにぴったりですね。
![]()
【Yuki】
そうですね。大量のデータを扱う際に、見やすく整列させて表示できるのは大きな魅力だと思います。show="headings" を指定しないと、左端にツリー展開用のアイコンが表示されるので、フォルダ構成などを表現するときにも使えますよ。
タブ切り替え:Notebookウィジェット
![]()
【Yuki】
もう一つ、ttkでよく使われる便利なウィジェットに「Notebook(ノートブック)」があります。これは、ブラウザのタブのように画面を切り替える機能を提供してくれます。
![]()
【Hiroki】
タブ機能!最近のアプリでは必須ですよね。それも簡単に作れるんですか?
![]()
【Yuki】
はい、ttk.Notebook を使えば比較的シンプルに実装できるはずです。
# ノートブックの作成
notebook = ttk.Notebook(root)
# タブ1(フレームを作成して追加)
tab1 = ttk.Frame(notebook)
notebook.add(tab1, text="基本設定")
# タブ2
tab2 = ttk.Frame(notebook)
notebook.add(tab2, text="詳細設定")
notebook.pack(expand=True, fill="both")
# 各タブの中に部品を配置する
label1 = ttk.Label(tab1, text="ここは設定画面です")
label1.pack(pady=20)
![]()
【Hiroki】
Frame を作って、それを notebook.add すればいいんですね。これなら、一つのウィンドウにたくさんの機能を詰め込んでも、すっきり整理できそうです。
![]()
【Yuki】
ええ、画面がごちゃごちゃしてしまうと使う人も困ってしまうので、こうして整理整頓できる機能はとても大切だと思います……。
ttkの「状態」と動的なスタイル変更
![]()
【Hiroki】
Yukiさん、ボタンにマウスを乗せた時に色が変わったりするのは、自分でプログラミングしなきゃいけないんですか?
![]()
【Yuki】
基本的にはttkが自動でやってくれますが、より細かく制御したい場合は「map」という機能を使います。ttkウィジェットには、active(マウスが乗っている)、pressed(押されている)、disabled(無効化されている)といった「状態(state)」があるんです。
![]()
【Hiroki】
その状態に合わせて、色を個別に指定できるということですか?
![]()
【Yuki】
その通りです。例えば、「ボタンが押されている時だけ背景色を濃くしたい」という場合は、以下のように記述します。
style.map("TButton",
foreground=[('pressed', 'red'), ('active', 'blue')],
background=[('pressed', 'black')]
)
![]()
【Hiroki】
なるほど!リストとタプルを組み合わせて、状態ごとの設定を書くわけですね。ちょっと複雑ですけど、慣れれば自由自在にデザインできそうです。
レイアウトのコツ:FrameとPadding
![]()
【Yuki】
ttkを使っていると、部品同士の隙間が気になってくるかもしれません。ttkの多くのウィジェットには padding という引数があって、内側の余白を簡単に設定できるんです。
![]()
【Hiroki】
padding=10 みたいに書くんですか?
![]()
【Yuki】
はい。単一の数値なら上下左右すべて同じ余白になりますし、(左, 上, 右, 下) というタプルで渡すことで、個別に指定することもできます。特に、ttk.Frame を使って部品をグループ化するときに、この余白を適切に設定すると、とても見栄えが良くなると思います……。
![]()
【Hiroki】
確かに、ぎゅうぎゅうに詰まっているより、少し余裕がある方が使いやすそうですね。
外部テーマの利用
![]()
【Hiroki】
Yukiさん、もっと劇的に見た目を変える方法はないんでしょうか?さっきの clam や alt もいいですけど、もう少し現代的な……例えばダークモードみたいなデザインにしたいです。
![]()
【Yuki】
実は、標準のテーマ以外にも、有志が作成した外部テーマを使う方法があります。最近では 「sv-ttk」 や 「Azure-ttk-theme」 といったライブラリが有名ですね。これらを使うと、Windows 11のようなモダンなデザインやダークモードを、一行のコードで適用できるんです。
![]()
【Hiroki】
そんなものがあるんですね!Pythonの外部ライブラリとしてインストールすれば使えるんですか?
![]()
【Yuki】
そうです。例えば pip install sv-ttk と実行してから、プログラム内で import sv_ttk; sv_ttk.set_theme("dark") と呼ぶだけで、アプリ全体が驚くほど綺麗になります。
![]()
【Hiroki】
それはすごい!モチベーションが上がりますね。
最新の技術とttkの今後
![]()
【Yuki】
最近では、デスクトップアプリを作る手法としてWeb技術(Electronなど)や、AIを活用したGUI生成も増えています。AIといえば、最近は Gemini 1.5 Flash (gemini-1.5-flash) のような高速なモデルも出てきていて、GUIのコードを一瞬で生成してくれることもありますね……。
![]()
【Hiroki】
AIに骨組みを作ってもらって、そこから自分でttkを使って微調整していく……という流れだと効率が良さそうです。
![]()
【Yuki】
ええ、素晴らしいアイデアだと思います。ただ、AIが作ったコードを正しく理解して修正するためにも、今日お話ししたような「スタイル」や「ウィジェットの親子関係」といった基本知識は、きっとHirokiくんの助けになってくれるはずです。
![]()
【Hiroki】
はい!まずは基本のウィジェットを組み合わせて、自分だけのツールを作ってみようと思います。
![]()
【Yuki】
応援していますね。もし何かわからないことがあったら、いつでも聞いてください。私も……できる限りサポートしますから。
参考リソース
- Python 公式ドキュメント: tkinter.ttk
- TkDocs: Ttk Widgets (英語ですが、非常に詳しく体系的に学べます)
- PyPI: sv-ttk (モダンなテーマライブラリ)
![]()
【Yuki】
……あ、最後に一つだけ。Tkinterはとても歴史があるライブラリなので、古い記事と新しい記事が混ざっていることが多いかもしれません。迷ったときは、公式ドキュメントを確認するか、ttk を使っているかどうかをチェックしてみてくださいね。
![]()
【Hiroki】
わかりました!まずは公式ドキュメントを読みながら、色々と試してみます。Yukiさん、ありがとうございました!
![]()
【Yuki】
どういたしまして。お疲れ様でした、Hirokiくん。
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


