mei_13のPython講座 ロゴ

【解説】Pythonの標準GUIライブラリをより美しく:Tkinter-ttkの基礎から応用まで




Pythonの標準GUIライブラリをより美しく:Tkinter-ttkの基礎から応用まで


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。今日はPythonでデスクトップアプリを作る際にとても便利な「Tkinter-ttk」についてお話ししようと思います。以前、基本的なTkinterについては少し触れたことがあったかもしれませんが、その進化系のようなものだと考えてもらえるといいかもしれません……。


Hirokiのアイコン
【Hiroki】 Yukiさん、こんにちは!はい、Tkinterで簡単なウィンドウを出したことはあります。でも、なんだか見た目が少し古いというか、昔のOSのような感じがしてしまって……。もっと今風の綺麗なボタンや部品を使いたいなと思っていたんです。それが「ttk」なんですか?


Yukiのアイコン
【Yuki】 そうですね、まさにHirokiくんが感じた「見た目の古さ」を解決するために導入されたのがttk(Tk Themed widgets)なんです。Python 2.7や3.1から標準ライブラリに追加されたもので、従来のTkinterよりも「モダンな外観」と「コードの柔軟性」を両立させているんですよ。


Hirokiのアイコン
【Hiroki】 モダンな外観!それは楽しみです。具体的に普通のTkinterとは何が違うんでしょうか?


Yukiのアイコン
【Yuki】 大きな違いは、「ウィジェットのロジック」と「見た目(スタイル)」が分離されていることだと思います。従来のTkinterは、ボタンの背景色やフォントをボタンそのものの設定として書き込んでいました。でもttkでは、「スタイル」という仕組みを使って、見た目を一括管理できるようになっているんです。これにより、OSごとのネイティブな見た目に近づけることも可能になります。

Tkinter-ttkの導入と基本的な構成


Hirokiのアイコン
【Hiroki】 なるほど、見た目の管理がしやすくなっているんですね。さっそく使ってみたいです!どうやってインポートすればいいんですか?


Yukiのアイコン
【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のアイコン
【Hiroki】 あ、from tkinter import ttkが必要なんですね。実行してみると、確かに「ttkのボタン」の方が少し立体的だったり、マウスを乗せた時の反応が今風な感じがします!


Yukiのアイコン
【Yuki】 そう言ってもらえると嬉しいです。ttkを使う際は、ウィジェットを作成するときに tk.Button ではなく ttk.Button のように、頭に「ttk.」を付けて呼び出すのがルールですね。

スタイル(ttk.Style)による一括管理


Hirokiのアイコン
【Hiroki】 さっき「見た目とロジックの分離」と言っていましたが、具体的にどうやって色や形を変えるんですか?


Yukiのアイコン
【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のアイコン
【Hiroki】 TButton というのが、ttkのボタン全体を指すキーワードなんですね。


Yukiのアイコン
【Yuki】 その通りです。これを「スタイル名」と呼びます。もし、特定のボタンだけ別のデザインにしたい場合は、自分で新しい名前を作ることもできるんですよ。例えば "My.TButton" のように名前を付けて、ウィジェット作成時に style="My.TButton" と指定すれば、特定の部品だけに適用されます。少し控えめに個性を出したいときに便利かもしれません……。


Hirokiのアイコン
【Hiroki】 特定の部品だけ変えられるのはいいですね。ところで、theme_use って何ですか?


Yukiのアイコン
【Yuki】 ttkには「テーマ」という概念があります。OS標準のような default、少しフラットな clam、クラシックな alt など、いくつかのセットが用意されています。これらを切り替えるだけで、アプリ全体の雰囲気をガラッと変えることができるんです。

高機能なウィジェット:Treeview


Hirokiのアイコン
【Hiroki】 ボタン以外にも、ttkにしかない便利な部品はあるんでしょうか?


Yukiのアイコン
【Yuki】 はい、実はttkを使う最大のメリットの一つに、「Treeview(ツリービュー)」というウィジェットがあります。これは表形式でデータを表示したり、ファイルマネージャーのように階層構造を表示したりするのに非常に優れているんです。


Hirokiのアイコン
【Hiroki】 表が作れるんですか!それは便利そうです。どうやって書くんですか?


Yukiのアイコン
【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のアイコン
【Hiroki】 すごい!ちゃんとしたリスト形式になりました。これ、データベースの中身を表示したりするのにぴったりですね。


Yukiのアイコン
【Yuki】 そうですね。大量のデータを扱う際に、見やすく整列させて表示できるのは大きな魅力だと思います。show="headings" を指定しないと、左端にツリー展開用のアイコンが表示されるので、フォルダ構成などを表現するときにも使えますよ。

タブ切り替え:Notebookウィジェット


Yukiのアイコン
【Yuki】 もう一つ、ttkでよく使われる便利なウィジェットに「Notebook(ノートブック)」があります。これは、ブラウザのタブのように画面を切り替える機能を提供してくれます。


Hirokiのアイコン
【Hiroki】 タブ機能!最近のアプリでは必須ですよね。それも簡単に作れるんですか?


Yukiのアイコン
【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のアイコン
【Hiroki】 Frame を作って、それを notebook.add すればいいんですね。これなら、一つのウィンドウにたくさんの機能を詰め込んでも、すっきり整理できそうです。


Yukiのアイコン
【Yuki】 ええ、画面がごちゃごちゃしてしまうと使う人も困ってしまうので、こうして整理整頓できる機能はとても大切だと思います……。

ttkの「状態」と動的なスタイル変更


Hirokiのアイコン
【Hiroki】 Yukiさん、ボタンにマウスを乗せた時に色が変わったりするのは、自分でプログラミングしなきゃいけないんですか?


Yukiのアイコン
【Yuki】 基本的にはttkが自動でやってくれますが、より細かく制御したい場合は「map」という機能を使います。ttkウィジェットには、active(マウスが乗っている)、pressed(押されている)、disabled(無効化されている)といった「状態(state)」があるんです。


Hirokiのアイコン
【Hiroki】 その状態に合わせて、色を個別に指定できるということですか?


Yukiのアイコン
【Yuki】 その通りです。例えば、「ボタンが押されている時だけ背景色を濃くしたい」という場合は、以下のように記述します。

style.map("TButton",
    foreground=[('pressed', 'red'), ('active', 'blue')],
    background=[('pressed', 'black')]
)


Hirokiのアイコン
【Hiroki】 なるほど!リストとタプルを組み合わせて、状態ごとの設定を書くわけですね。ちょっと複雑ですけど、慣れれば自由自在にデザインできそうです。

レイアウトのコツ:FrameとPadding


Yukiのアイコン
【Yuki】 ttkを使っていると、部品同士の隙間が気になってくるかもしれません。ttkの多くのウィジェットには padding という引数があって、内側の余白を簡単に設定できるんです。


Hirokiのアイコン
【Hiroki】 padding=10 みたいに書くんですか?


Yukiのアイコン
【Yuki】 はい。単一の数値なら上下左右すべて同じ余白になりますし、(左, 上, 右, 下) というタプルで渡すことで、個別に指定することもできます。特に、ttk.Frame を使って部品をグループ化するときに、この余白を適切に設定すると、とても見栄えが良くなると思います……。


Hirokiのアイコン
【Hiroki】 確かに、ぎゅうぎゅうに詰まっているより、少し余裕がある方が使いやすそうですね。

外部テーマの利用


Hirokiのアイコン
【Hiroki】 Yukiさん、もっと劇的に見た目を変える方法はないんでしょうか?さっきの clamalt もいいですけど、もう少し現代的な……例えばダークモードみたいなデザインにしたいです。


Yukiのアイコン
【Yuki】 実は、標準のテーマ以外にも、有志が作成した外部テーマを使う方法があります。最近では 「sv-ttk」「Azure-ttk-theme」 といったライブラリが有名ですね。これらを使うと、Windows 11のようなモダンなデザインやダークモードを、一行のコードで適用できるんです。


Hirokiのアイコン
【Hiroki】 そんなものがあるんですね!Pythonの外部ライブラリとしてインストールすれば使えるんですか?


Yukiのアイコン
【Yuki】 そうです。例えば pip install sv-ttk と実行してから、プログラム内で import sv_ttk; sv_ttk.set_theme("dark") と呼ぶだけで、アプリ全体が驚くほど綺麗になります。


Hirokiのアイコン
【Hiroki】 それはすごい!モチベーションが上がりますね。

最新の技術とttkの今後


Yukiのアイコン
【Yuki】 最近では、デスクトップアプリを作る手法としてWeb技術(Electronなど)や、AIを活用したGUI生成も増えています。AIといえば、最近は Gemini 1.5 Flash (gemini-1.5-flash) のような高速なモデルも出てきていて、GUIのコードを一瞬で生成してくれることもありますね……。


Hirokiのアイコン
【Hiroki】 AIに骨組みを作ってもらって、そこから自分でttkを使って微調整していく……という流れだと効率が良さそうです。


Yukiのアイコン
【Yuki】 ええ、素晴らしいアイデアだと思います。ただ、AIが作ったコードを正しく理解して修正するためにも、今日お話ししたような「スタイル」や「ウィジェットの親子関係」といった基本知識は、きっとHirokiくんの助けになってくれるはずです。


Hirokiのアイコン
【Hiroki】 はい!まずは基本のウィジェットを組み合わせて、自分だけのツールを作ってみようと思います。


Yukiのアイコン
【Yuki】 応援していますね。もし何かわからないことがあったら、いつでも聞いてください。私も……できる限りサポートしますから。

参考リソース


Yukiのアイコン
【Yuki】 ……あ、最後に一つだけ。Tkinterはとても歴史があるライブラリなので、古い記事と新しい記事が混ざっていることが多いかもしれません。迷ったときは、公式ドキュメントを確認するか、ttk を使っているかどうかをチェックしてみてくださいね。


Hirokiのアイコン
【Hiroki】 わかりました!まずは公式ドキュメントを読みながら、色々と試してみます。Yukiさん、ありがとうございました!


Yukiのアイコン
【Yuki】 どういたしまして。お疲れ様でした、Hirokiくん。



< Tkinter-キーバインド
コラム一覧に戻る
Numpy-zeros >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

  • 専門家の知見に基づいた、保守性の高いコード設計
  • AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
  • ChatGPT等が生成したコードのデバッグ・最適化

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
● 高品質なサンプルコード
詳細はこちら
興味がある方はまず質問だけでもどうぞ!



AIアシスタント Yuki