😽
【Python】Tkinterの1つ目のコンボボックスの値によって2つ目のコンボボックスを変える方法
1. はじめに
Tkinterは、Pythonに標準で搭載されているGUIライブラリです。デスクトップアプリケーションを作成する際、ユーザーの選択に応じて他のウィジェットの表示内容を動的に変更することはよくある要求です。この記事では、1つ目のコンボボックスの選択値に基づいて2つ目のコンボボックスの選択肢を動的に変更する方法を紹介します。
2. 基本のセットアップ
まずは、Tkinterの基本セットアップを行い、メインウィンドウと2つのコンボボックスを作成します。
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("動的コンボボックス")
# 1つ目のコンボボックスの値
options1 = ["果物", "野菜"]
# 2つ目のコンボボックスの値
options2 = {
"果物": ["りんご", "バナナ", "オレンジ"],
"野菜": ["キャベツ", "トマト", "にんじん"]
}
# 1つ目のコンボボックス
combo1 = ttk.Combobox(root, values=options1)
combo1.pack(pady=10)
# 2つ目のコンボボックス
combo2 = ttk.Combobox(root)
combo2.pack(pady=10)
root.mainloop()
3. コンボボックスの連動
1つ目のコンボボックスの選択値に基づいて2つ目のコンボボックスの値を更新するために、以下の手順を実装します。
3.1 コールバック関数の作成
1つ目のコンボボックスの選択が変更されたときに呼び出されるコールバック関数を作成します。この関数内で、2つ目のコンボボックスの選択肢を更新します。
def update_combo2(event):
selected = combo1.get()
combo2['values'] = options2[selected]
combo2.set('') # 初期値をリセット
3.2 コールバック関数のバインド
1つ目のコンボボックスに、選択が変更されたときにコールバック関数を呼び出すようバインドします。
combo1.bind("<<ComboboxSelected>>", update_combo2)
3.3 完成したコード
これらの手順を組み合わせると、次のような完成したコードになります。
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("動的コンボボックス")
# 1つ目のコンボボックスの値
options1 = ["果物", "野菜"]
# 2つ目のコンボボックスの値
options2 = {
"果物": ["りんご", "バナナ", "オレンジ"],
"野菜": ["キャベツ", "トマト", "にんじん"]
}
# コールバック関数
def update_combo2(event):
selected = combo1.get()
combo2['values'] = options2[selected]
combo2.set('') # 初期値をリセット
# 1つ目のコンボボックス
combo1 = ttk.Combobox(root, values=options1)
combo1.pack(pady=10)
combo1.bind("<<ComboboxSelected>>", update_combo2)
# 2つ目のコンボボックス
combo2 = ttk.Combobox(root)
combo2.pack(pady=10)
root.mainloop()
コードの説明
-
tkinter
モジュールとttk
モジュールをインポートします。 - メインウィンドウを作成し、タイトルを設定します。
- 1つ目のコンボボックスの選択肢(
options1
)と2つ目のコンボボックスの選択肢(options2
)を定義します。 -
update_combo2
関数を定義し、1つ目のコンボボックスの選択が変更されたときに2つ目のコンボボックスの値を更新します。 -
combo1
を作成し、update_combo2
関数をバインドします。 -
combo2
を作成します。 -
root.mainloop()
でメインウィンドウを表示します。
4. まとめ
この記事では、Tkinterを使用して1つ目のコンボボックスの選択に基づいて2つ目のコンボボックスの値を動的に変更する方法を紹介しました。この方法を利用することで、ユーザーインターフェースの柔軟性を高め、よりインタラクティブなアプリケーションを作成することができます。ぜひ、自分のアプリケーションで試してみてください。
Discussion