TkinterでListboxにスクロールバーを付ける方法 ─ 3行で動くサンプル付き

Python 標準 GUI ライブラリ TkinterListbox を使うと、項目数が増えた瞬間にスクロールがなくて詰まる──そんな経験ありませんか?
実は たった 3 行 追加するだけで縦横スクロール対応のリストボックスが完成します。本記事では 「まず動く最小コード」→「pack/grid/ttk 別の応用レシピ」→「スクロールが動かない原因チェック」 の順で、初心者でも迷わないよう体系的に解説します。


目次

Listbox と Scrollbar が連携する仕組み

Tk の Listbox には

yscrollcommand … スクロールバーの位置を通知

xscrollcommand … 水平バー用

があらかじめ用意され、逆に Scrollbar 側は commandListbox.yview()xview() を呼び出します。この双方向コールバックが噛み合うと、つまみ移動で表示範囲が同期するわけです。citeturn0search10


環境と前提条件

項目推奨バージョン理由
Python3.8 – 3.123.12 でも API 変更なし
Tk8.6 以上ttk テーマ対応
OSWindows / macOS / Linux 共通バンドル Tcl/Tk で動作

超高速!3 行サンプルコード

from tkinter import Tk, Listbox, Scrollbar, RIGHT, Y

lb = Listbox(Tk()); Scrollbar(lb.master, command=lb.yview).pack(side=RIGHT, fill=Y)
lb.pack(); lb.config(yscrollcommand=lb.master.children['!scrollbar'].set)
Tk().mainloop()

インポートを除く 3 行 で実行可
ScrollbarListbox と同じ親ウィジェットで OK
yscrollcommandcommand を相互設定すれば完了


コード解説

処理補足
1Listbox と親ウィンドウ生成省メモリなら Tk() を変数に入れる
2Scrollbar → yview をコールバックfill=Y で縦方向に伸長
3Listboxyscrollcommand を設定Scrollbar.set が自動でつまみ位置を更新

実用パターン別レシピ

pack で縦スクロール(基本形)

root = Tk()
frame = Frame(root)
frame.pack()

sb = Scrollbar(frame)
sb.pack(side=RIGHT, fill=Y)

lb = Listbox(frame, yscrollcommand=sb.set)
lb.pack(side=LEFT, fill=BOTH, expand=True)

sb.config(command=lb.yview)

パック順が「スクロールバー → リストボックス」でも動きますが、可読性重視でフレームを挟むと UI が崩れません。

grid で縦+横を同時に付ける

root = Tk()
lb = Listbox(root, width=40, height=10)
vbar = Scrollbar(root, command=lb.yview)
hbar = Scrollbar(root, orient='horizontal', command=lb.xview)

lb.grid(row=0, column=0, sticky='nsew')
vbar.grid(row=0, column=1, sticky='ns')
hbar.grid(row=1, column=0, sticky='ew')

lb.config(yscrollcommand=vbar.set, xscrollcommand=hbar.set)
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)

grid はセルサイズを動的に伸縮できるので、レスポンシブなツール系 GUI に最適です。

ttk + themed scrollbar でモダン UI

from tkinter import Tk, ttk

root = Tk()
style = ttk.Style(root); style.theme_use('clam')  # Dark mode 対応

lb = tk.Listbox(root)
vbar = ttk.Scrollbar(root, command=lb.yview)
lb.config(yscrollcommand=vbar.set)

vbar.pack(side=tk.RIGHT, fill=tk.Y)
lb.pack(fill=tk.BOTH, expand=True)

ttk.Scrollbar を使うだけでネイティブライクな外観に。Python Assets の記事でも ttk + Listbox 組み合わせが推奨されています。


スクロールが動かないときのチェックリスト

症状原因解決策
つまみが動いてもリストが動かないcommand 未設定Scrollbar(command=lb.yview) を確認
リストは動くがバー位置が更新されないyscrollcommand 未設定lb.config(yscrollcommand=sb.set)
横方向だけ効かないorient='horizontal' 不足Scrollbar(..., orient='horizontal')
バーが横に並ぶpack 順序ミスフレームで左右を明示
バーが消えたアイテム数不足height を小さくして動作確認

よくある質問

Q. Listbox を 2 列にしたい場合は?

A. ttk.Treeviewttk.ListboxExtension が便利。複数列・ソート付きで、スクロールバー連携も同じ要領です。

Q. macOS でスクロールバーが細すぎる

A. style.configure("Vertical.TScrollbar", troughcolor="#ddd", width=14) で太さを調整可能。

Q. MouseWheel を連動させたい

A. <MouseWheel> イベントを lb.yview_scroll(int(-1*(event.delta/120)), "units") にバインドすると自然な動きになります。


まとめ

  • やることは 3 行Scrollbar(command=…), yscrollcommand, pack/grid のみ
  • grid なら縦横バーも楽々レイアウト、ttk を使えばモダンに
  • 動かないときは コールバック設定漏れorient を最優先で疑う
  • GUI ツール自作・ログビューア・チャットアプリなど、スクロール可能リストは Tkinter の鉄板部品。ぜひ本記事のサンプルをコピペして即活用してください。

コメント

コメントする

目次