Python GTK+3 チュートリアル

14. コンボボックス

翻訳して勉強するGtkチュートリアル第14章 コンボボックス です。


Gtk.ComboBox はドロップダウンメニューから項目を選択することができます。これは画面上にたくさんのラジオボタンを配置するよりも、場所を取らないので好ましいです。必要に応じて、テキスト、画像、チェックボックス、プログレスバーなど、各項目に関する追加情報を表示することができます。

Gtk.ComboBox Gtk.TreeView と非常に似ており、どちらも model-view パターンを使用しています。有効な選択肢のリストはツリーモデルの形式で指定され、選択肢の表示はセルレンダラを使用してモデルのデータに合わせることができます。コンボボックスに多数の項目が含まれている場合は、リストではなくグリッドで表示した方が良いかもしれません。これは Gtk.ComboBox.set_wrap_width() を呼び出すことで実現できます。

Gtk.ComboBox ウィジェットは通常ユーザが利用可能な選択肢を制限しますが、オプションで Gtk.Entry を持つことができ、利用可能な選択肢のどれもが適切でない場合に任意のテキストを入力することができます。これを行うには、静的メソッド Gtk.ComboBox.new_with_entry() Gtk.ComboBox.new_with_model_and_entry() のいずれかを使って Gtk.ComboBox のインスタンスを作成します。

シンプルなテキストによる選択肢リストの場合、Gtk.ComboBox の model-view API は少し圧倒的すぎるかもしれません。このような場合は、Gtk.ComboBoxText がシンプルな代替手段となります。Gtk.ComboBox Gtk.ComboBoxText はどちらもエントリを含むことができます。

14.1. 例

動作テスト - コンボボックス
# tut14.py
# コンボボックス サンプル

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class ComboBoxWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="ComboBox Example")

        self.set_border_width(10)

        name_store = Gtk.ListStore(int, str)
        name_store.append([1, "Billy Bob"])
        name_store.append([11, "Billy Bob Junior"])
        name_store.append([12, "Sue Bob"])
        name_store.append([2, "Joey Jojo"])
        name_store.append([3, "Rob McRoberts"])
        name_store.append([31, "Xavier McRoberts"])

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)

        name_combo = Gtk.ComboBox.new_with_model_and_entry(name_store)
        name_combo.connect("changed", self.on_name_combo_changed)
        name_combo.set_entry_text_column(1)
        vbox.pack_start(name_combo, False, False, 0)

        country_store = Gtk.ListStore(str)
        countries = [
            "Austria",
            "Brazil",
            "Belgium",
            "France",
            "Germany",
            "Switzerland",
            "United Kingdom",
            "United States of America",
            "Uruguay",
        ]
        for country in countries:
            country_store.append([country])

        country_combo = Gtk.ComboBox.new_with_model(country_store)
        country_combo.connect("changed", self.on_country_combo_changed)
        renderer_text = Gtk.CellRendererText()
        country_combo.pack_start(renderer_text, True)
        country_combo.add_attribute(renderer_text, "text", 0)
        vbox.pack_start(country_combo, False, False, True)

        currencies = [
            "Euro",
            "US Dollars",
            "British Pound",
            "Japanese Yen",
            "Russian Ruble",
            "Mexican peso",
            "Swiss franc",
        ]
        currency_combo = Gtk.ComboBoxText()
        currency_combo.set_entry_text_column(0)
        currency_combo.connect("changed", self.on_currency_combo_changed)
        for currency in currencies:
            currency_combo.append_text(currency)

        vbox.pack_start(currency_combo, False, False, 0)

        self.add(vbox)

    def on_name_combo_changed(self, combo):
        tree_iter = combo.get_active_iter()
        if tree_iter is not None:
            model = combo.get_model()
            row_id, name = model[tree_iter][:2]
            print("Selected: ID=%d, name=%s" % (row_id, name))
        else:
            entry = combo.get_child()
            print("Entered: %s" % entry.get_text())

    def on_country_combo_changed(self, combo):
        tree_iter = combo.get_active_iter()
        if tree_iter is not None:
            model = combo.get_model()
            country = model[tree_iter][0]
            print("Selected: country=%s" % country)

    def on_currency_combo_changed(self, combo):
        text = combo.get_active_text()
        if text is not None:
            print("Selected: currency=%s" % text)


win = ComboBoxWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()


関連記事