Python
 Computer >> コンピューター >  >> プログラミング >> Python

Tkinterでオートコンプリート付きのコンボボックスを作成する方法

TkinterのComboboxウィジェットは、アプリケーションにドロップダウンメニューを実装する際に便利なウィジェットの一つです。内部的にはEntryウィジェットとListboxウィジェットを組み合わせた構成になっており、Entryフィールドに項目名を入力することで(メニューリストに存在する場合)、目的のメニュー項目を選択できます。

しかし、単純な選択だけでなく、オートコンプリート(自動補完)を使ってメニュー項目を絞り込みながら選択したいケースも少なくありません。本記事では、入力内容に応じて候補がリアルタイムに絞り込まれるコンボボックスの作成方法を解説します。

オートコンプリート付きコンボボックスの仕組み

オートコンプリート機能を実現するには、まず候補一覧を表示するListboxと、ユーザーが入力を行うEntryウィジェットを作成します。そして、Entryウィジェットに「<KeyRelease>」イベントをバインドすることで、キー入力のたびにリスト内から該当するキーワードを検索できます。マッチする項目が存在すれば、Listboxの内容を動的に更新します。

サンプルコード

ここでは、以下の2つの関数を作成します。

  • check(e):入力されたテキストがリスト内に存在するかどうかを判定する関数です。入力キーワードと一致する項目があれば、そのデータを使って表示を更新します。
  • update(data):渡されたデータでListboxの内容を書き換える関数です。
# 必要なライブラリをインポート
from tkinter import *
from tkinter import ttk

# tkinterフレーム(ウィンドウ)のインスタンスを作成
win = Tk()

# ウィンドウのサイズを設定
win.geometry("700x350")

# ウィンドウのタイトルを設定
win.title("Combobox - オートコンプリート")

# 入力内容に応じて候補を絞り込む関数
def check(e):
    v = entry.get()
    if v == '':
        data = values
    else:
        data = []
        for item in values:
            if v.lower() in item.lower():
                data.append(item)
    update(data)

# Listboxの内容を更新する関数
def update(data):
    # 既存の候補をすべて削除
    menu.delete(0, END)
    # 新しい候補を追加
    for value in data:
        menu.insert(END, value)

# ラベルウィジェットを追加
label = Label(win, text="デモ:Comboboxウィジェット",
              font=('Helvetica 15 bold'), background="green3")
label.pack(padx=10, pady=25)

# 説明用ラベルを追加
text = Label(win, text="プログラミング言語を選択してください")
text.pack(padx=15, pady=20)

# Entryウィジェットを作成し、KeyReleaseイベントにcheck()をバインド
entry = Entry(win, width=35)
entry.pack()
entry.bind('<KeyRelease>', check)

# 候補一覧を表示するListboxウィジェットを作成
menu = Listbox(win)
menu.pack()

# メニュー項目のリストを定義
values = ['Python', 'C++', 'Java', 'Ruby on Rails', 'Rust',
          'GoLang', 'Objective-C', 'C#', 'PHP', 'Swift', 'JavaScript']

# 初期状態としてすべての項目を表示
update(values)

win.mainloop()

ポイント解説

  • 大文字・小文字を区別しない検索v.lower() in item.lower()とすることで、入力が「py」「PY」「Py」のいずれでも「Python」がヒットするようになります。
  • 空文字への対応:入力欄が空の場合は全項目を再表示するため、文字を削除すると候補が元に戻ります。
  • <KeyRelease>イベント:キーが離されたタイミングで発火するため、確定した入力内容に対して毎回検索処理が実行されます。

実行結果

上記のPythonスクリプトを実行すると、EntryウィジェットとListboxが配置されたウィンドウが表示されます。キーワードを入力するたびに、入力内容に一致する項目だけがListboxにリアルタイムで表示されます。たとえば「J」と入力すれば「Java」と「JavaScript」のみが残り、さらに絞り込むことも可能です。

Tkinterでオートコンプリート付きのコンボボックスを作成する方法

なお、Listboxから項目をクリックして選択できるようにしたい場合は、「<<ListboxSelect>>」イベントをバインドし、選択された値をEntryウィジェットに挿入する処理を追加すると、より完成度の高いオートコンプリートUIになります。

  1. TkinterのEntryウィジェットにデフォルトテキストを設定する方法

    TkinterのEntryウィジェットは、ユーザーが入力した1行のテキストを表示・取得するための基本的なGUI部品です。ログインフォームやサインアップフォームなど、ユーザーとのやり取りが必要なさまざまなアプリケーションで広く利用されています。 Entryウィジェットにデフォルトテキスト(初期表示テキスト)を設定したい場合は、insert()メソッドを使用します。挿入位置とデフォルトとして表示したいテキストを引数として渡すだけで、簡単に実装できます。 実装例 以下の例では、デフォルトテキストが設定されたEntryウィジェットを作成しています。 # tkinterライブラリをインポート from

  2. PythonのTkinterで簡単なメッセージボックスを作成する方法

    Tkinterとは Tkinterは、PythonでGUIアプリケーションを作成・開発するための標準ライブラリです。ボタンやラベルなど、アプリケーションに多彩な機能を追加するためのメソッドや関数が豊富に用意されており、ダイアログボックスなどのウィジェットも簡単に作成できます。 この記事では、ポップアップで情報を表示したり、ユーザーに選択肢を提示したりできるシンプルなメッセージボックスの作成方法を解説します。 メッセージボックスの作成例 以下のサンプルコードでは、「Click」ボタンをクリックすると、エラーメッセージと警告メッセージが順番にポップアップ表示されるようにしています。 # 必要なラ