【Python tkinter】ドロップダウンリスト(プルダウン)を表示:Comboboxウィジェット
2021.05.25 /
本記事ではPythonのTkinterにおける、Combobox(コンボボックス)ウィジェットを使用した、ドロップダウンリスト(プルダウン)を表示する方法について解説していきます。
Tkinterには19種類ものウィジェットと呼ばれるGUIアプリケーションを構築するための部品が用意されています。
そしてウィジェットの外観がTkinterよりモダンになり機能も充実したttkでは、Tkinterにはなかった新たな6種類のウィジェットが用意されています。
ウィジェット名 | 説明 |
---|---|
Combobox | リストから選択または値を入力できるコンボボックスを表示 |
Notebook | 1つ以上のタブを表示 |
Progressbar | 実行されているタスクの進行状況を表示 |
Separator | ウィジェットの間に境界線を表示 |
Sizegrip | 画面右下にウィンドウサイズを変更するグリップを表示 |
Treeview | 表形式と階層構造の両方でデータを表示 |
Tkinterの基本的な使い方については、以下記事をご参照ください。
【Python】tkinterを使ったGUIアプリケーションの作成方法
本記事で紹介するComboboxウィジェットはこのttkで備えられているウィジェットになります。
またttkではtkinterにはなかったstyleという設定を使用して、ウィジェットの外観を変更します。
Tkinterとttkの違いについては、以下記事で詳しく解説しています。
【Python】ttk:tkinterと比べた各ウィジェットの外観と機能面の違い
本記事を通して以下の知識を学べます。
- 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)
横幅:width
オプションwidthによって、コンボボックスの横幅を指定できます。
横幅はコンボボックス内で表示される文字数で指定します。
combobox = ttk.Combobox(root, width=7)
文字位置:justify
オプションjustifyによって、コンボボックスに表示するテキストの文字位置を指定することができます。
combobox = ttk.Combobox(root, justify="center")
状態: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")
カーソルの種類については、以下サイトを参考にしてください。
文字サイズ: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")
- 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')
以下にテーマを変更し、スタイル設定を変更したアプリケーションの例を記します。
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アプリケーション開発のために様々なウィジェット(部品)が用意されていますので、まずはすべてのウィジェットが使えるようになってみてください。