【Python tkinter】複数のタブを実装したGUIアプリの作成(Notebookウィジェット)

2021.05.04 /

【Python tkinter】複数のタブを実装したGUIアプリの作成(Notebookウィジェット)

本記事では、Pythonのtkinterを使用して作成するGUIアプリに、複数のタブ追加する方法について解説していきます。

一つの画面に様々な機能をまとめていると、見た目や使いやすさが悪くなり、ユーザビリティが良くないです。

そこでタブを使って機能を分けることで、ユーザビリティの改善が見込めます。

ぜひ本記事で紹介しているタブの実装方法を身に着けて、ご自身のGUIアプリにタブを追加してみてください。

tkinterの基本的な使い方がわからない方は以下記事をご参照ください。

本記事を通して以下の知識を学べます。

学べる知識
  • tkinterのウィジェットについて
  • Notebookウィジェットについて
  • タブを実装する方法について

Notebookウィジェット

tkinter.ttkのウィジェットについて

PythonでGUIアプリケーションを作成するには、標準ライブラリであるtkinterを使用します。

そのtkinterには、GUIアプリケーションを形作るためのウィジェットが多く存在します。
そのウィジェットには、ButtonやEntryウィジェットなどを含めて12種類のウィジェットがあります。

そしてtkinterをよりモダンにしたtkinter.ttkには、tkinterの12個のウィジェットにプラス6種類の全18種類のウィジェットが用意されています。

本記事で解説するNotebookウィジェットはtkinter.ttkの中に含まれます。

このNotebookウィジェットについて詳しく見ていきましょう。

Notebookウィジェットとは

tkinter.ttkに用意されているNotebookウィジェットは、複数のウィンドウ(ウィジェット)をタブによって表示切り替えを可能にしてくれます。

タブの一つをクリックすると、その選択したタブに紐づいているウィンドウ(ウィジェット)を表示します。

このNotebookウィジェットを使用することで、様々な機能を各ウィンドウに整理して表示することができます。
多機能なGUIアプリを作成する上では必須なウィジェットです。

Notebookウィジェットの使い方

tkinter.ttkのインポートとメインウィンドウの作成

tkinter.ttkはPythonに標準で含まれています。
そのためpipでインストールすることは必要ないです。

ただプログラムの先頭でtkinter.ttkをインポートすることが必要になります。

from tkinter import ttk

次にGUIアプリケーションのメインウィンドウとなるrootを作成します。

# tkinterのインポート
import tkinter as tk
import tkinter.ttk as ttk

# rootメインウィンドウの設定
root = tk.Tk()
root.title("Notebook Widget")
root.geometry("300x100")

ここまでがGUIアプリケーションを作成する上で共通する流れです。

次にrootメインウィンドウにタブを設置していきたいと思います。

タブを作成・配置する流れ

Notebookウィジェットを用いてGUIアプリケーションにタブを作成・設置するには、以下の流れでプログラムを作成します。

  1. Notebookウィジェットを作成
  2. タブの作成
  3. タブをNotebookウィジェットに追加
  4. Notebookウィジェットを配置
  5. 各タブにウィジェットを作成・配置

Notebookウィジェットを作成

Notebookウィジェットを作成するには、以下のように記述します。

notebook = ttk.Notebook(container, option)

第一引数containerには、親ウィジェットを指定します。
大抵はrootメインウィンドウを指定します。

第二引数optionには、以下に示すオプションを指定することができます。

オプション名 意味
height 高さの指定
width 横幅の指定
cursor マウスホバー時のカーソルの指定
padding 内部間隔を指定

タブの作成

タブを作成するために、タブに表示するウィジェットを以下のように作ります。

tab = tk.Frame(notebook)

第一引数に指定する親ウィジェットには、Notebookウィジェットを指定します。

タブのウィジェットには、Frameウィジェットが使われることが多いです。
もちろんFrame以外にもCanvasやLavelもタブに紐づけることができます。

タブをNotebookウィジェットに追加

ttk.Notebookが提供するadd()メソッドを使って、タブをNotebookウィジェットに追加します。

notebook.add(tab, option)

Notebookウィジェットに対してaddメソッドを使用します。

第一引数に子ウィジェットとなるタブを指定し、それ以降にはオプションを指定します。
add()メソッドには、以下に示すオプションが存在します。

オプション 意味
text タブ上に表示するテキストの指定
image タブ上に表示する画像の指定
compound テキストと画像の両方を表示する場合の画像の位置
underline 指定した位置の文字にアンダーラインを引く
sticky タブ内の子ウィジェットの位置を指定(n, s, w, e)
state タブの状態を指定。disabled:選択不可。hidden:表示しない

compoundで画像の位置を指定は、tk.TOP、tk.BOTTOM、tk.LEFT、tk.RIGHT 、tk.CENTERとする。
例えばtk.LEFTとすると、画像が左、テキストが右に位置する。

Notebookウィジェットを配置

packやgridなどを使ってNotebookウィジェットを配置します。

notebook.pack()

各タブにウィジェットを作成・配置

あとは好きなように作成したタブ(Frameウィジェット)にLabelやButtonなどのウィジェットを作成・配置して完成となります。

サンプル

上記で説明した「タブを作成・配置する流れ」を元に、簡単なアプリを以下に示します。

# tkinterのインポート
import tkinter as tk
import tkinter.ttk as ttk

# rootメインウィンドウの設定
root = tk.Tk()
root.title("Notebook Widget")
root.geometry("300x100")

# Notebookウィジェットの作成
notebook = ttk.Notebook(root)

# タブの作成
tab_one = tk.Frame(notebook, bg='white')
tab_two = tk.Frame(notebook, bg='blue')

# notebookにタブを追加
notebook.add(tab_one, text="tab1", underline=0)
notebook.add(tab_two, text="tab2")

# tab_oneに配置するウィジェットの作成
label = ttk.Label(tab_one, text="Notebook ウィジェットの作成", background='white')

# ウィジェットの配置
notebook.pack(expand=True, fill='both', padx=10, pady=10)
label.pack()

root.mainloop()

上記ソースコードを起動すると、次のようなGUIアプリケーションが起動します。

tkinter:GUIアプリ Notebookでタブを追加
tkinter:GUIアプリ タブを変更

Notebookウィジェットのメソッド

Notebookウィジェットには、add()メソッド以外にも有用なメソッドがいくつか用意されています。

forget()メソッド

forget()メソッドは、Notebookウィジェットからタブを取り除くメソッドです。

引数にタブを指定することで、指定したタブをNotebookウィジェットから取り除きます。

notebook.forget(tab)

hide()メソッド

hide()メソッドは、forget()メソッドのようにNotebookウィジェットからタブを取り除くメソッドです。引数にはtabIdを指定します。

forget()メソッドとの違いとしては、hide()メソッドは一時的に取り除くという点です。

再度タブを表示するには、add()メソッドを使用します。

まとめ

本記事「【Python tkinter】複数のタブを実装したGUIアプリの作成(Notebookウィジェット)」はいかがでしたか。

様々な機能を実装したGUIアプリを作成する場合は、本記事で紹介した方法でタブを追加して、ユーザーに使いやすいアプリ作成をしてみてください。