【Python tkinter】ドロップダウンリスト(プルダウン)を表示:Comboboxウィジェット

時計 2021.05.25 / 時計

【Python tkinter】ドロップダウンリスト(プルダウン)を表示:Comboboxウィジェット

本記事ではPythonのTkinterにおける、Combobox(コンボボックス)ウィジェットを使用した、ドロップダウンリスト(プルダウン)を表示する方法について解説していきます。

Tkinterには19種類ものウィジェットと呼ばれるGUIアプリケーションを構築するための部品が用意されています。
そしてウィジェットの外観がTkinterよりモダンになり機能も充実したttkでは、Tkinterにはなかった新たな6種類のウィジェットが用意されています。

ウィジェット名 説明
Combobox リストから選択または値を入力できるコンボボックスを表示
Notebook 1つ以上のタブを表示
Progressbar 実行されているタスクの進行状況を表示
Separator ウィジェットの間に境界線を表示
Sizegrip 画面右下にウィンドウサイズを変更するグリップを表示
Treeview 表形式と階層構造の両方でデータを表示

Tkinterの基本的な使い方については、以下記事をご参照ください。

本記事で紹介するComboboxウィジェットはこのttkで備えられているウィジェットになります。

またttkではtkinterにはなかったstyleという設定を使用して、ウィジェットの外観を変更します。

Tkinterとttkの違いについては、以下記事で詳しく解説しています。

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

学べる知識
  • Comboboxの生成と配置
  • Comboboxのオプション
  • Comboboxのstyleを使用した外観の変更
  • Comboboxのメソッド

Combobox(コンボボックス)ウィジェット

Comboboxウィジェットとは

Comboboxウィジェットとは、次図のようなデータをドロップダウンリストで表示して選択できるウィジェットのことです。

ドロップダウンリストでデータを選択するだけでなく、キーボードでデータを自由に入力することも可能です。

そのためListboxウィジェットとEntryウィジェットを組み合わせたようなウィジェットと言えます。

ListboxとEntryのコンビネーションなので、(きっと)コンボボックスと言います。

ComboboxウィジェットはTkinter.ttkモジュールのTkテーマ付きウィジェットであるため、Comboboxウィジェットの生成には、事前にttkをインポートする必要があります。

import tkinter.ttk as ttk

Comboboxウィジェットの生成

Comboboxウィジェットを生成するために、次のようにttk.Comboboxを使用します。

combobox = ttk.Combobox(parent, option)

parentにはコンボボックスを表示させたい親ウィジェット(frame)またはメインウィンドウ(root)を指定します。

optionsにはComboboxウィジェットに用意されているオプションを指定します。

Comboboxオブジェクトを生成したら、pack()やgrid()で配置することでコンボボックスウィジェットを指定した親ウィジェットに配置できます。

オプション一覧

Comboboxウィジェットに用意されているオプションの一覧を以下に記します。

オプション名 説明
height 高さ:ドロップダウンリストの表示する行数を指定
width 横幅:文字数を指定
justify テキストの配置位置:LEFT、CENTER、RIGHT
state コンボボックスの状態:nomal、readonly、disabled
textvariable コンボボックスの値を保持する変数を指定
values ドロップダウンリストに表示するデータ
cursor マウスホバー時のカーソルを指定
takefocus Tabでのフォーカス指定
postcommand ドロップダウンリスト表示前に呼ばれるコールバック関数
font テキスト文字のフォントタイプ、サイズ、太さを指定
style スタイルを指定

各オプションの使用方法

高さ:height

オプションheightによって、コンボボックスの高さを指定できます。
ここでの高さとは、ドロップダウンリストで表示するデータ件数を差します。

combobox = ttk.Combobox(root, height=3)

ttk:Comboboxウィジェットのオプションheight

横幅:width

オプションwidthによって、コンボボックスの横幅を指定できます。
横幅はコンボボックス内で表示される文字数で指定します。

combobox = ttk.Combobox(root, width=7)

ttk:Comboboxウィジェットのオプションwidth

文字位置:justify

オプションjustifyによって、コンボボックスに表示するテキストの文字位置を指定することができます。

combobox = ttk.Combobox(root, justify="center")

ttk:Comboboxウィジェットのオプションjustify

状態:state

オプションstateによって、コンボボックスの状態を指定できます。
デフォルトではnomalとなっています。

combobox = ttk.Combobox(root, state="readonly")

stateにreadonlyを指定すると、Entryの機能が失われます。

すなわちキーボードによる入力ができなくなり、ドロップダウンリストから選択するのみとなります。

stateにdisabledを指定すると、入力および選択が不可になります。

値を保持する変数:textvariable

オプションtextvariableによって、コンボボックスの値を保持する変数を指定します。 textvariableに変数を指定する前に、その変数を事前に定義しておく必要があります。

v = tk.StringVar()
combobox = ttk.Combobox(root, textvariable= v)

ドロップダウンリストに表示するデータ:values

オプションvaluesによって、ドロップダウンリストに表示するデータを指定します。
表示するデータ群は事前に定義しておく必要があります。

module = ('tkinter', 'math', 'os', 'pyinstaller', 'pathlib', 'sys')
combobox = ttk.Combobox(root, values=module)

マウスホバー時のカーソル:cursor

オプションcursorによって、コンボボックスにマウスがホバーしたときのカーソルの種類を指定することができます。

combobox = ttk.Combobox (root, cursor="dot")

カーソルの種類については、以下サイトを参考にしてください。

Python – Tkinter Cursors

文字サイズ:font

オプションfontによって、コンボボックスのテキスト文字サイズやフォントタイプ、太さを指定できます。

combobox = ttk.Combobox(root, font=("Courier", 16, "bold"))

オプションfontの第一引数にフォントタイプ、第二引数に文字サイズ、第三引数に太さを指定します。

スタイルを指定:style

オプションstyleによって、コンボボックスのスタイルを指定することができます。

スタイルを使用することによって、コンボボックスの外観を変更することができます。

詳しい使用方法は、次項で詳しく解説していきます。

外観の変更:スタイル(Style)、テーマ(theme)

スタイル(Style)の設定

ttkの各ウィジェットはスタイル(style)を使用して外観を変更します。
これはTkinterのウィジェットにはなかった設定です。

Ttkの各ウィジェットにはデフォルトスタイルが設定されており、ComboboxではTComboboxというスタイルが設定されています。

ttkでスタイルによる外観変更をするには、まず新たにスタイルオブジェクトを生成します。

style = ttk.Style()

次にスタイルオブジェクトに対してconfigure()メソッドを使用して、外観などの設定を変更していきます。

style.configure("office.TCombobox", foreground="red")

上記ではスタイル名をoffice.TCombobox、フォントの色を赤に変更しています。

スタイルオブジェクトの生成・設定変更ができましたら、コンボボックスを生成する際にオプションstyleでスタイル名を指定します。

combobox = ttk.Combobox(root, textvariable= v, values=module, style="office.TCombobox")

ttk:Comboboxのstyleオプション
  • foreground
  • selectbackground
  • selectforeground
  • fieldbackground
  • padding
  • lightcolor
  • arrowsize
  • bordercolor

上記のオプションにはテーマ依存のオプションがあります。

テーマ依存のオプションは、使用しているテーマによって反映しないことがあります。
これはテーマで設定されているスタイルが優先されるためです。

テーマ(theme)の設定

ttkはテーマ付きウィジェット(Tk themed widget)と言われるように、各ウィジェットにはテーマが設定されています。

テーマの一覧は次のように確認することができます。

style = ttk.Style()
print(style.theme_names())
# ('winnative', 'clam', 'alt', 'default', 'classic', 'vista', 'xpnative')

上記からわかるように7種類のテーマが用意されています。

テーマを変更する場合は、theme_use()メソッドを使用します。

style.theme_use('classic')

以下にテーマを変更し、スタイル設定を変更したアプリケーションの例を記します。

tkinterアプリケーション:ComboboxをStyleで変更
import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.geometry('200x100')

style = ttk.Style()
style.theme_use("winnative")
style.configure("office.TCombobox", selectbackground="blue", fieldbackground="red", padding=5)

module = ('tkinter', 'math', 'os', 'pyinstaller', 'pathlib', 'sys')

v = tk.StringVar()

combobox = ttk.Combobox(root, textvariable= v, values=module, style="office.TCombobox")

combobox.pack(pady=10)

root.mainloop()

Combobox(コンボボックス)ウィジェットのメソッド一覧

Comboboxウィジェットで使用できるメソッドの一部を以下に記します。

メソッド名 説明
.current() 選択されているデータのインデックスを返す
.set(value) 指定したvalueをテキスト入力欄に加える
.get() 選択されているデータの値(String)を返す
.delete(first, last=None) 指定範囲の文字を削除

上記のメソッドが主にComboboxウィジェットで使用するメソッドです。

データ選択時に呼び出されるイベント(関数)をバインドする:bind()

オブジェクトに特定のイベント(クリックや選択など)が発生した場合に、実行される処理(コールバック関数)を設定(バインド)するにはbind()メソッドを使用します。

オブジェクト.bind(イベント, 関数)

第一引数のイベントには、イベントの種類を指定します。

Comboboxウィジェットではユーザーがリストからデータを選択するとイベント<<ComboboxSelected>が発生します。

このイベントをComboboxオブジェクトにバインドするには、次のように記述します。

combobox.bind('<<ComboboxSelected>>', 実行されるコールバック関数)

コールバック関数ではEventオブジェクトを受け取るため、必ず次のよう引数を設定しておいてください。

def 関数名(event):

Comboboxウィジェットで選択された値(データ)を取得:get()メソッド

Comboboxウィジェット内のデータが選択された時に、そのデータを取得してコンソール画面上に表示するプログラムを作成します。

関数の定義

Combobox内のデータが選択された時に呼ばれるコールバック関数を考えます。

関数の定義は次のようにEventオブジェクトを受け取れるように引数eventを指定しています。

def select_combo(event):

選択されたデータの取得

Comboboxで選択されたデータの取得には、get()メソッドを使用します。

次の一文を定義した関数select_comboに追加します。

print(combobox.get())

ウィジェットに関数をバインドさせる

生成したコンボボックスに上記で作成した関数を、イベント発生時に実行されるようにバインドします。

combobox.bind('<<ComboboxSelected>>', select_combo)

ソースコード

以下にCombobox内のデータが選択されたときに、そのデータを取得してコンソール画面に表示するプログラムを記します。

import tkinter as tk
from tkinter import ttk

def select_combo(event):
    print(combobox.get())

root = tk.Tk()
root.geometry('200x100')

style = ttk.Style()
style.theme_use("winnative")
style.configure("office.TCombobox", selectbackground="blue", padding=5)

module = ('tkinter', 'math', 'os', 'pyinstaller', 'pathlib', 'sys')

v = tk.StringVar()

combobox = ttk.Combobox(root, textvariable= v, values=module, style="office.TCombobox")
combobox.bind('<<ComboboxSelected>>', select_combo)

combobox.pack(pady=10)

root.mainloop()

まとめ

本記事「【Python tkinter】ドロップダウンリスト(プルダウン)を表示:Comboboxウィジェット」はいかがでしたか。

TkinterにはGUIアプリケーション開発のために様々なウィジェット(部品)が用意されていますので、まずはすべてのウィジェットが使えるようになってみてください。