【Python tkinter】Scrollbar(スクロールバー)ウィジェットを作成・配置する方法

時計 2021.01.10 / 時計

【Python tkinter】Scrollbar(スクロールバー)ウィジェットを作成・配置する方法

本記事ではPythonのtkinterによるScrollbar(スクロールバー)ウィジェットの作成方法を解説していきます。

PythonによるGUIアプリケーションの作成にはtkinterが標準モジュールとして用意されています。

GUIアプリで複数の文字列から一つ選択させる場合では、スクロールバーを使用しますよね。
このスクロールバーをtkinterで表示できるようになれば、アプリ開発の幅がぐーんとアップします。

本記事を通して以下の知識を学ぶことができます。

学べる知識
  • tkinterのスクロールバーウィジェットの使い方
  • スクロールバーの作成と配置方法
  • 対象ウィジェットとスクロールバーの紐づけ方法

Scrollbar(スクロールバー)ウィジェットとは

Scrollbar(スクロールバー)ウィジェットは縦方向や横方向にスクロールするために使用されるスライドコントローラーを提供します。

このスクロールバーウィジェットは以下ウィジェットに対してスクロールバーを作ることができます。

  • Listbox
  • Text
  • Canvas
  • Entry

Frameウィジェットにはスクロールバーは対応していないため注意が必要です。

例えば複数のボタンウィジェットをFrameウィジェットに配置してスクロールできるようにすることはできません。

この場合はCanvasウィジェットにFrameウィジェットを配置し、そのFrameウィジェットに対してButtonウィジェットを配置するという方法をとります。

Scrollbar(スクロールバー)の作成・配置

Scrollbar(スクロールバー)の作成手順

スクロールバーは以下の流れで作成・配置していきます。

  1. 対象ウィジェットを作成
  2. Scrollbar(スクロールバー)の作成
  3. Scrollbar(スクロールバー)を対象ウィジェットに反映させる
  4. 各ウィジェットを配置

以下で各手順について解説していきます。

各種ウィジェットの作成

スクロールバーを付けたいウィジェットを作成します。
本記事ではListbox(リストボックス)に対してスクロールバーを付けます。

import tkinter as tk
from tkinter import ttk

# rootメインウィンドウの設定
root = tk.Tk()
root.title("ttk app")
root.geometry("200x100")

# メインフレームの作成と設置
frame = ttk.Frame(root)
frame.pack(padx=20,pady=10)

# Listboxの選択肢
days = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday')
lists = tk.StringVar(value=days)

# 各種ウィジェットの作成
Listbox = tk.Listbox(frame, listvariable=lists, height=4)

root.mainloop()

Listboxの選択肢には7つの文字列を入れます。
Listboxは親ウィジェットframeに配置し、高さ(height)は4です。

ここでListboxには高さ(height)を指定する必要があります。高さの指定がないと、スクロールバーがうまく動かない可能性があります。

Scrollbar(スクロールバー)の作成

スクロールバーの作成にはtkinter.Scrollbarを使用します。

scrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL, command=Listbox.yview)

Scrollbarの第一引数には親ウィジェットを指定し、第二引数以降はオプションを指定します。

ここではorientオプションで配置の方向VERTICAL(縦配置)を設定し、commandオプションで縦方向にスクロールyviewを設定しています。

(横方向の場合はHORIZONTAL、xviewを設定する)

Scrollbar(スクロールバー)を対象ウィジェットに反映させる

作成したスクロールバーを対象ウィジェットに反映させるには以下のように記述します。

Listbox["yscrollcommand"] = scrollbar.set

対象ウィジェットのyscrollcommand属性(横方向の場合はxscrollcommand)をScrollbarオブジェクトのsetメソッドでスクロールバーを設定しています。

これによりリストボックスとスクロールバーが紐づき、スクロールでリスト内を動かすことができるようになります。

各ウィジェットを配置

対象ウィジェットとスクロールバーの作成・紐づけが終わったら配置を行います。

Listbox.grid(row=0, column=0)

scrollbar.grid(row=0, column=1, sticky=(tk.N, tk.S))

これでリストボックスをスクロールバーでスクロールできるプログラムが完成です。

サンプルプログラム

ここまでで記述してきたプログラムの全体を以下に記します。

tkinter スクロールバーの使い方
import tkinter as tk
from tkinter import ttk

# rootメインウィンドウの設定
root = tk.Tk()
root.title("scroll app")
root.geometry("200x100")

# メインフレームの作成と設置
frame = ttk.Frame(root)
frame.pack(padx=20,pady=10)

# Listboxの選択肢
days = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday')
lists = tk.StringVar(value=days)

# 各種ウィジェットの作成
Listbox = tk.Listbox(frame, listvariable=lists, height=4)

# スクロールバーの作成
scrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL, command=Listbox.yview)

# スクロールバーをListboxに反映
Listbox["yscrollcommand"] = scrollbar.set

# 各種ウィジェットの設置
Listbox.grid(row=0, column=0)
scrollbar.grid(row=0, column=1, sticky=(tk.N, tk.S))

root.mainloop()

Scrollbar(スクロールバー)オプション一覧

主に使用するオプションを以下に記します。

オプション 説明
activebackground 背景色(アクティブ時)
bg 背景色
bd 枠線のサイズ
cursor マウスがホバー時のマウス種類の指定
orient スクロールの方向(HORIZONTAL、VERTICAL)
width スクロールバーの横幅