GUI

[Python Tkinter] タブ(Notebook)を選択状態にする方法

PythonのTkinterライブラリでタブを管理するためには、ttk.Notebookウィジェットを使用します。

特定のタブを選択状態にするには、Notebookselect()メソッドを使用します。

例えば、notebook.select(tab_id)のように、タブのインデックスやタブウィジェット自体を引数として渡すことで、そのタブを選択状態にできます。

タブのインデックスは0から始まります。

Notebookウィジェットのタブを選択状態にする方法

PythonのTkinterライブラリを使用すると、GUIアプリケーションを簡単に作成できます。

その中でも、Notebookウィジェットはタブ形式のインターフェースを提供し、複数の画面を切り替えて表示することができます。

ここでは、Notebookウィジェットのタブを選択状態にする方法について解説します。

select()メソッドの使い方

select()メソッドは、Notebookウィジェットの特定のタブを選択するために使用されます。

このメソッドを使うことで、プログラムからタブを選択状態にすることができます。

以下はその基本的な使い方です。

import tkinter as tk
from tkinter import ttk
# メインウィンドウの作成
root = tk.Tk()
root.title("Notebook Example")
# Notebookウィジェットの作成
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
# タブの作成
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
notebook.add(tab2, text='タブ2')
# タブを選択する
notebook.select(tab2)  # タブ2を選択
root.mainloop()

このコードを実行すると、アプリケーションが起動し、タブ2が選択された状態で表示されます。

タブのインデックスを指定して選択する

タブを選択する際に、タブのインデックスを指定することも可能です。

インデックスは0から始まる整数で、タブの順序に基づいています。

以下の例では、インデックスを使ってタブを選択します。

import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("Notebook Example")
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
notebook.add(tab2, text='タブ2')
# インデックスを指定してタブを選択する
notebook.select(0)  # タブ1を選択
root.mainloop()

このコードを実行すると、タブ1が選択された状態で表示されます。

タブウィジェットを指定して選択する

タブを選択する際には、タブウィジェットを直接指定することもできます。

これにより、タブのインデックスを気にせずに選択することができます。

以下の例を見てみましょう。

import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("Notebook Example")
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
notebook.add(tab2, text='タブ2')
# タブウィジェットを指定して選択する
notebook.select(tab1)  # タブ1を選択
root.mainloop()

このコードを実行すると、タブ1が選択された状態で表示されます。

現在選択されているタブを取得する方法

現在選択されているタブを取得するには、index()メソッドを使用します。

このメソッドは、現在選択されているタブのインデックスを返します。

以下の例では、選択されているタブのインデックスを取得して表示します。

import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("Notebook Example")
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
notebook.add(tab2, text='タブ2')
# 現在選択されているタブのインデックスを取得
selected_index = notebook.index(notebook.select())
print(f"選択されているタブのインデックス: {selected_index}")
root.mainloop()

このコードを実行すると、選択されているタブのインデックスがコンソールに表示されます。

Notebookウィジェットのタブ管理

TkinterのNotebookウィジェットでは、タブの追加や削除、状態の変更など、タブの管理が簡単に行えます。

ここでは、それぞれの操作について詳しく解説します。

タブの追加と削除

タブを追加するには、add()メソッドを使用します。

また、タブを削除するには、forget()メソッドを使用します。

以下の例では、タブの追加と削除の方法を示します。

import tkinter as tk
from tkinter import ttk
def add_tab():
    new_tab = ttk.Frame(notebook)
    notebook.add(new_tab, text=f'タブ{notebook.index("end") + 1}')
def remove_tab():
    if notebook.index("end") > 0:  # タブが存在する場合
        notebook.forget(notebook.index("end") - 1)  # 最後のタブを削除
root = tk.Tk()
root.title("Notebook Example")
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
# 初期タブの作成
tab1 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
# ボタンでタブの追加と削除
add_button = tk.Button(root, text='タブを追加', command=add_tab)
add_button.pack(side='left')
remove_button = tk.Button(root, text='タブを削除', command=remove_tab)
remove_button.pack(side='left')
root.mainloop()

このコードを実行すると、「タブを追加」ボタンで新しいタブを追加し、「タブを削除」ボタンで最後のタブを削除できます。

タブの状態を変更する(無効化・有効化)

タブの状態を無効化するには、stateオプションを使用します。

無効化されたタブは選択できなくなります。

以下の例では、タブの無効化と有効化の方法を示します。

import tkinter as tk
from tkinter import ttk
def disable_tab():
    notebook.tab(0, state='disabled')  # 最初のタブを無効化
def enable_tab():
    notebook.tab(0, state='normal')  # 最初のタブを有効化
root = tk.Tk()
root.title("Notebook Example")
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
# 初期タブの作成
tab1 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
# ボタンでタブの状態を変更
disable_button = tk.Button(root, text='タブを無効化', command=disable_tab)
disable_button.pack(side='left')
enable_button = tk.Button(root, text='タブを有効化', command=enable_tab)
enable_button.pack(side='left')
root.mainloop()

このコードを実行すると、「タブを無効化」ボタンで最初のタブが無効化され、選択できなくなります。

「タブを有効化」ボタンで再び選択できるようになります。

タブ選択の応用例

TkinterのNotebookウィジェットを使用することで、タブ選択に基づいたさまざまな応用が可能です。

ここでは、タブ選択に関連するいくつかの応用例を紹介します。

タブ選択時にイベントを発生させる

タブが選択されたときに特定のイベントを発生させるには、<<NotebookTabChanged>>イベントを使用します。

このイベントをバインドすることで、タブが変更された際に特定の処理を実行できます。

以下の例では、タブが変更されるたびにメッセージを表示します。

import tkinter as tk
from tkinter import ttk
def on_tab_change(event):
    selected_tab = notebook.tab(notebook.select(), "text")
    print(f"選択されたタブ: {selected_tab}")
root = tk.Tk()
root.title("Notebook Example")
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
notebook.add(tab2, text='タブ2')
# タブ選択時のイベントをバインド
notebook.bind("<<NotebookTabChanged>>", on_tab_change)
root.mainloop()

このコードを実行すると、タブが変更されるたびに選択されたタブの名前がコンソールに表示されます。

タブ選択を条件にした動的なUI変更

タブの選択に応じて、他のウィジェットの表示内容を動的に変更することも可能です。

以下の例では、タブ1が選択されたときにラベルのテキストを変更します。

import tkinter as tk
from tkinter import ttk
def on_tab_change(event):
    selected_tab = notebook.tab(notebook.select(), "text")
    label.config(text=f"現在のタブ: {selected_tab}")
root = tk.Tk()
root.title("Notebook Example")
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
notebook.add(tab2, text='タブ2')
label = tk.Label(root, text="現在のタブ: タブ1")
label.pack()
# タブ選択時のイベントをバインド
notebook.bind("<<NotebookTabChanged>>", on_tab_change)
root.mainloop()

このコードを実行すると、タブが変更されるたびにラベルのテキストが更新されます。

タブ選択を記憶して次回起動時に復元する

タブの選択状態を記憶し、次回アプリケーションを起動したときに復元することもできます。

以下の例では、選択されたタブのインデックスをファイルに保存し、アプリケーション起動時にそのインデックスを読み込んでタブを選択します。

import tkinter as tk
from tkinter import ttk
import json
import os
def save_selected_tab(index):
    with open("selected_tab.json", "w") as f:
        json.dump({"selected_tab": index}, f)
def load_selected_tab():
    if os.path.exists("selected_tab.json"):
        with open("selected_tab.json", "r") as f:
            data = json.load(f)
            return data.get("selected_tab", 0)
    return 0
root = tk.Tk()
root.title("Notebook Example")
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
notebook.add(tab2, text='タブ2')
# 前回選択されたタブを復元
selected_index = load_selected_tab()
notebook.select(selected_index)
# タブ選択時にインデックスを保存
def on_tab_change(event):
    save_selected_tab(notebook.index(notebook.select()))
notebook.bind("<<NotebookTabChanged>>", on_tab_change)
root.mainloop()

このコードを実行すると、アプリケーションを終了して再起動した際に、前回選択していたタブが復元されます。

タブ選択を他のウィジェットと連動させる

タブの選択に応じて、他のウィジェットの状態を変更することもできます。

以下の例では、タブ1が選択されたときにボタンを有効化し、タブ2が選択されたときに無効化します。

import tkinter as tk
from tkinter import ttk
def on_tab_change(event):
    if notebook.index(notebook.select()) == 0:  # タブ1が選択された場合
        button.config(state='normal')
    else:  # タブ2が選択された場合
        button.config(state='disabled')
root = tk.Tk()
root.title("Notebook Example")
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
notebook.add(tab2, text='タブ2')
button = tk.Button(root, text='タブ1でのみ有効', state='normal')
button.pack()
# タブ選択時のイベントをバインド
notebook.bind("<<NotebookTabChanged>>", on_tab_change)
root.mainloop()

このコードを実行すると、タブ1が選択されているときはボタンが有効になり、タブ2が選択されるとボタンが無効になります。

実践例:Notebookウィジェットを使った簡単なアプリケーション

TkinterのNotebookウィジェットを使用して、複数のタブを持つ簡単なアプリケーションを作成します。

このアプリケーションでは、タブごとに異なるウィジェットを配置し、タブ選択に応じたデータの表示切り替えや保存・読み込みを行います。

複数タブを持つフォームの作成

まず、複数のタブを持つ基本的なフォームを作成します。

以下のコードでは、2つのタブを持つNotebookウィジェットを作成します。

import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("Notebook Example")
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
# タブの作成
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
notebook.add(tab2, text='タブ2')
root.mainloop()

このコードを実行すると、2つのタブを持つウィンドウが表示されます。

タブごとに異なるウィジェットを配置する

次に、各タブに異なるウィジェットを配置します。

タブ1にはエントリーとボタン、タブ2にはラベルとテキストボックスを配置します。

import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("Notebook Example")
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
# タブの作成
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
notebook.add(tab2, text='タブ2')
# タブ1にウィジェットを配置
entry = tk.Entry(tab1)
entry.pack(pady=10)
button = tk.Button(tab1, text='送信')
button.pack(pady=10)
# タブ2にウィジェットを配置
label = tk.Label(tab2, text='ここにテキストを入力してください:')
label.pack(pady=10)
text_box = tk.Text(tab2, height=5, width=30)
text_box.pack(pady=10)
root.mainloop()

このコードを実行すると、タブ1にはエントリーとボタン、タブ2にはラベルとテキストボックスが表示されます。

タブ選択に応じたデータの表示切り替え

タブ選択に応じて、表示するデータを切り替える機能を追加します。

タブ1で入力したデータをタブ2に表示するようにします。

import tkinter as tk
from tkinter import ttk
def show_data():
    data = entry.get()
    text_box.delete(1.0, tk.END)  # テキストボックスをクリア
    text_box.insert(tk.END, data)  # 入力データを表示
root = tk.Tk()
root.title("Notebook Example")
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
# タブの作成
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
notebook.add(tab2, text='タブ2')
# タブ1にウィジェットを配置
entry = tk.Entry(tab1)
entry.pack(pady=10)
button = tk.Button(tab1, text='送信', command=show_data)
button.pack(pady=10)
# タブ2にウィジェットを配置
label = tk.Label(tab2, text='ここにテキストを入力してください:')
label.pack(pady=10)
text_box = tk.Text(tab2, height=5, width=30)
text_box.pack(pady=10)
root.mainloop()

このコードを実行すると、タブ1で入力したデータがタブ2のテキストボックスに表示されます。

タブ選択に応じたデータの保存・読み込み

最後に、タブ選択に応じてデータを保存し、次回起動時に復元する機能を追加します。

タブ1で入力したデータをファイルに保存し、アプリケーション起動時に読み込みます。

import tkinter as tk
from tkinter import ttk
import json
import os
def save_data():
    data = entry.get()
    with open("data.json", "w") as f:
        json.dump({"input_data": data}, f)
def load_data():
    if os.path.exists("data.json"):
        with open("data.json", "r") as f:
            data = json.load(f)
            entry.delete(0, tk.END)  # エントリーをクリア
            entry.insert(tk.END, data.get("input_data", ""))  # データを表示
def show_data():
    data = entry.get()
    text_box.delete(1.0, tk.END)  # テキストボックスをクリア
    text_box.insert(tk.END, data)  # 入力データを表示
root = tk.Tk()
root.title("Notebook Example")
notebook = ttk.Notebook(root)
notebook.pack(expand=True, fill='both')
# タブの作成
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text='タブ1')
notebook.add(tab2, text='タブ2')
# タブ1にウィジェットを配置
entry = tk.Entry(tab1)
entry.pack(pady=10)
button = tk.Button(tab1, text='送信', command=lambda: [show_data(), save_data()])
button.pack(pady=10)
# タブ2にウィジェットを配置
label = tk.Label(tab2, text='ここにテキストを入力してください:')
label.pack(pady=10)
text_box = tk.Text(tab2, height=5, width=30)
text_box.pack(pady=10)
# アプリ起動時にデータを読み込む
load_data()
root.mainloop()

このコードを実行すると、タブ1で入力したデータがファイルに保存され、アプリケーションを再起動した際にそのデータが復元されます。

これにより、タブ選択に応じたデータの保存・読み込みが実現されます。

まとめ

この記事では、PythonのTkinterライブラリを使用したNotebookウィジェットのタブ管理や応用例について詳しく解説しました。

タブの選択や管理に関する基本的な操作から、タブ選択に応じた動的なUI変更やデータの保存・読み込みまで、さまざまな機能を紹介しました。

これらの知識を活用して、よりインタラクティブで使いやすいGUIアプリケーションを作成してみてください。

関連記事

Back to top button