初心者でもPythonを使ってみよう

趣味と実益を兼ねたPython学習記

【スポンサーリンク】



tkinter.ttk Comboboxの使い方 Python

tkinter.ttkで利用できるComboboxの使い方を、実際にコードを書きながらまとめてみました。

目次

Comboboxの概要

Comboboxは、テキストボックスとリストボックスを組み合わせたようなウィジェットです。

リストボックスの使い方については、こちらを参照してください。

外観は1行のテキストボックスですが、右端の▼をクリックすると既存の値から選択することもできます。ユーザーは直接値を入力することもできますし、リストから選択することもできます。このようなコンボボックスは様々な場面で見かけますね。

以下に、tkinter.ttkで生成したコンボボックスの外観を示します。

f:id:vigilantPotato:20190518120135p:plain

見た目は普通の一行のテキストボックスですが、右端の▼を押してみると…

f:id:vigilantPotato:20190518120147p:plain

既存の値がリストで表示されました。ここでは、「Easy」、「Normal」、「Hard」の3つをリストとして与えてあります。

適当に選択してみましょう。

f:id:vigilantPotato:20190518120226p:plain

コンボボックスに、選択した値が表示されました。

このようなコンボボックスは様々なアプリで使用されており、省スペースかつ便利なウィジェットです。

Comboboxの基本

Options

  • values

    コンボボックスに表示する初期値を設定するためのオプション。 リストを設定すると、コンボボックスのドロップダウンリストに、リストの各文字列が表示される。

  • textvariable

    コンボボックスの表示値を操作するためのオプション。 「tkinter.Stringvar」オブジェクトを使用。 設定した値が変化すると、コンボボックスの表示値に反映される。

Event

  • ComboboxSelected

    コンボボックスのドロップダウンリストを選択したときに発生するイベント。

次は、これらのオプションを使用しながら簡単なアプリを作成し、使い方を確認していきます。

アプリ概要

コンボボックスで選択した値をラベルに表示させる機能を持つアプリを作成していきます。

最初に、完成したアプリの起動時の画面を以下に示します。

f:id:vigilantPotato:20190518120327p:plain

上から、ラベルとコンボボックス並べてあります。

コンボボックスから既存の値を選択すると、ラベルの表記が選択した値に変わります。

f:id:vigilantPotato:20190518120408p:plain

コンボボックスの基礎である、選択した値を取得して表示する機能を実装することができました。

コードの解説

準備

まずはモジュールのインポートと、tkinterのトップレベルウィジェットを作成します。

今回インポートするモジュールはtkinterとtkinter.ttkです。

import tkinter
from tkinter import ttk

#2.Comboboxクラス

if __name__ == "__main__":
    root = tkinter.Tk()
    
    #1.変数の設定
    #3.ラベル、コンボボックスの生成

    root.mainloop()

1. 変数の設定

変数として、「tkinter.Stringvar」のオブジェクトを生成します。

#1.変数の設定
var = tkinter.StringVar(master=root)

この変数「var」を用いて、コンボボックスで選択した値をリストに反映させます。

具体的には、ラベルの「textvariable」オプションに変数「var」を設定し、かつコンボボックスで選択した値を変数「var」にセットすることで、コンボボックスで選択した値がラベルの表示値に反映されるようになります。

2. Comboboxクラス

選択した値を変数「var」にセットするコンボボックスクラスを作成していきます。

#2.Comboboxクラス
class TestCombobox(ttk.Combobox):
    def __init__(self, var, master=None):
        li = ['Easy', 'Normal', 'Hard']     #初期値
        super().__init__(master, values=li) #初期値の設定
        self.var = var                      #varをインスタンス変数化
        self.bind('<<ComboboxSelected>>', self.show_selected)   #値選択時にshow_selectedを実行
        
    def show_selected(self, event):
        self.var.set(self.get())    #選択した値をvarにセット

「ComboboxSelected」イベントを用いて「show_selected」メソッドを呼び出し、選択した値を「var」にセットしています。

3. ラベル、コンボボックスの生成

ラベルとコンボボックスを生成していきます。

#3.ラベル、コンボボックスの生成
l = tkinter.Label(textvariable=var)
c = TestCombobox(master=root, var=var)
l.pack()
c.pack()

ラベル生成時に、「textvariable」オプションで「var」をセットしています。

コード全文

import tkinter
from tkinter import ttk

#2.Comboboxクラス
class TestCombobox(ttk.Combobox):
    def __init__(self, var, master=None):
        li = ['Easy', 'Normal', 'Hard']     #初期値
        super().__init__(master, values=li) #初期値の設定
        self.var = var                      #varをインスタンス変数化
        self.bind('<<ComboboxSelected>>', self.show_selected)   #値選択時にshow_selectedを実行
        
    def show_selected(self, event):
        self.var.set(self.get())    #選択した値をvarにセット


if __name__ == "__main__":
    root = tkinter.Tk()
    
    #1.変数の設定
    var = tkinter.StringVar(master=root)
    #3.ラベル、コンボボックスの生成
    l = tkinter.Label(textvariable=var)
    c = TestCombobox(master=root, var=var)
    l.pack()
    c.pack()

    root.mainloop()