TUTORIAL · Tkinter
Tkinter チュートリアル - Combobox
Python Tkinter コンボボックスのチュートリアル
このページの内容
ttk.Combobox は、選択肢のドロップダウンリストを持つ Tkinter フィールドです。その values オプションを設定してリストに入力し、current(index) を呼び出して位置で選択し、get() を使用して表示されたテキストを読み取ります。入力されたリストが最初の項目を自動的に選択することはありません。以下の短い Python の例は、ウィンドウを作成せずにインデックスとテキストの関係を示しています。このガイドの実際のウィジェットスニペットは、提供された実行環境にグラフィカルディスプレイがないため、インラインで示されています。選択コールバックについては、正確な仮想イベント名 <<ComboboxSelected>> をバインドして、ユーザーが項目を選択したときにハンドラーが応答するようにしてください。(<<ComboboxSelected>>)
Python Tkinter ttk.Combobox の例
この小さな例は、明示的な選択がその位置と表示テキストにどのように対応するかを示しています。Tk ウィンドウを開かずに実行されます。
months = ["January", "February", "March", "April"]
selected_index = 1
selected_text = months[selected_index]
print(selected_index, selected_text)
1 February
ウィジェットについては、from tkinter import ttk で ttk をインポートし、ttk.Combobox(parent, values=months) で作成し、combo.current(1) で初期選択を設定します。引数なしの current() メソッドは選択した項目のインデックスを返します。get() はその表示テキストを返します。デフォルトの normal 状態では、ユーザーはリストにない値を入力できます。その場合、get() はそのテキストを返し、リスト項目と一致しない場合 current() は -1 を返します。
コンボボックスとそのリストのフォントを設定する
font オプションは Combobox フィールドのスタイルを設定します。そのドロップダウンリストは別の Tk リストボックスなので、そのリストは *TCombobox*Listbox.font オプションパターンで設定します。たとえば、フィールド用に ("Courier", 16, "bold") のようなフォントタプルを作成し、リストを開く前に app.option_add("*TCombobox*Listbox.font", ("Courier", 14)) でルートウィンドウのオプションを設定します。フィールドとリストで異なるサイズや太さが必要な場合は、別々のタプルを使用してください。フォントファミリーの可用性はオペレーティングシステムに依存し、インストールされたフォントに置き換えられる場合があります。
Combobox の font だけを設定すると、リストのテキストがシステムのデフォルトフォントのままになることがあります。ドロップダウンが最初に開く前にリストボックスのオプションを設定し、コントロールの両部分が意図したスタイルを使用するようにしてください。
コールバックをコンボボックスの選択にバインドする
Tkinter は選択の仮想イベントを <<ComboboxSelected>> と名付けています。その正確な名前を combo.bind("<<ComboboxSelected>>", show_selection) でバインドし、ユーザーがリストから項目を選択した後に機能を実行します。コールバックは Tkinter のイベントオブジェクトを受け入れるように定義してください。たとえば def show_selection(event): print("Selected:", event.widget.get()) です。ユーザーが March を選択すると、コールバックは Selected: March を出力します。このイベントは、ユーザーがリストから選択したときに生成されます。コードで current() を使って値を設定することは、ユーザーが項目を選択することにはなりません。
コールバックは event.widget を通じてイベントを発したウィジェットを読み取るため、必要に応じて複数の Combobox で再利用することもできます。コールバックは、関連するラベルの更新やフォーム値の再計算など、選択への応答に集中させてください。
リストが開く前にコンボボックスの値を更新する
ユーザーがドロップダウンを開くたびに選択肢を更新すべき場合は、postcommand オプションを使用します。Tkinter はリストを表示する直前に割り当てられた関数を呼び出し、その関数が combo["values"] を置き換えられるようにします。たとえば、refresh_months() 関数は ["July", "August", "September", "October"] を代入できます。これを postcommand=refresh_months としてコンストラクタに渡してください。
postcommand は、ウィンドウが作成されるときではなく、リストが表示される前に実行されます。初期リストには January から April が含まれ、その後、最初に開いたときに利用可能な選択肢が July から October に更新されます。選択肢が変わったからといって、表示されたテキストが自動的に選択になるわけではありません。コールバックはドロップダウンを開く処理の一部として実行されるため、高速に保ってください。
コンボボックスを読み取り専用または無効にする
Combobox はデフォルトで state="normal" を使用し、ユーザーがフィールドに入力したり、リスト項目を選択したりできます。入力を防ぎながらリストからの選択を許可するには、state="readonly" を設定します。コントロールを利用できないようにする場合は state="disabled" を設定します。Tkinter はそれを非アクティブとして描画し、操作を防ぎます。たとえば、ttk.Combobox(app, values=months, state="normal")、state="readonly"、または state="disabled" でコントロールを作成し、ウィンドウでこれらのモードを比較してください。
値は提供された選択肢から得なければならないが、ユーザーがそれを変更できる必要がある場合は readonly を使用します。値が一時的に利用できない場合や、コントロールが情報提供のみの場合は disabled を使用します。無効化された Combobox は開くことも編集することもできません。その状態を normal または readonly に戻すと操作が復元されます。フォームに添えることができる他の Tkinter ウィジェットについては、Tkinter Entry チュートリアル と Tkinter Button チュートリアル を参照してください。