L'Isola di Niente
L'Isola di Niente » PyGObject Tips » コンボボックス

コンボボックス

コンボボックスはドロップダウンリストボックスをもつ Widget です。

GtkComboBox

GtkComboBox は GtkTreeModel をデータとして利用するツリービュー同様の Widget です。
ドロップダウンして選択すると changed シグナルが発生します。

GtkCellRenderer を使って表示を行いますが GtkTreeViewColumn は必要ありません。
GtkCellLayout は直接 GtkComboBox にインプリメントされています。

pack_start は GtkBox ではなく GtkCellLayout の関数なので注意。
add_attribute は pack 後でないと適用されないのも注意。

以下は TAIWAN[n][0] を選択すると TAIWAN[n][1] を書き出す例。
#!/usr/bin/env python3
 
from gi.repository import Gtk, Gio
 
TAIWAN = (
    ["SYM", "New Fighter 150 ZR"],
    ["KYMCO", "Racing 150 FI"],
    ["PGO", "Tigra 150"] )
 
class ComboBoxWin(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        # GtkListStore
        store = Gtk.ListStore.new([str, str])
        for l in TAIWAN:
            store.append(l)
        combobox = Gtk.ComboBox.new_with_model(store)
        combobox.connect("changed", self.on_changed)
        combobox.set_entry_text_column(0)
        #
        renderer = Gtk.CellRendererText.new()
        #column = Gtk.TreeViewColumn("Title", renderer, text=0)
        combobox.pack_start(renderer, True)
        combobox.add_attribute(renderer, "text", 0)
        # Label
        self.label = Gtk.Label("Select Taiwan Scooter")
        # pack
        vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
        vbox.pack_start(self.label, False, False, 0)
        vbox.pack_start(combobox, False, False, 0)
        # self
        self.add(vbox)
        self.connect("delete-event", Gtk.main_quit)
        self.show_all()
 
    def on_changed(self, widget):
        model = widget.get_model()
        active = widget.get_active()
        self.label.set_text(model[active][1])
 
ComboBoxWin()
Gtk.main()

img/gtk_combobox.png

GtkComboBoxText

GtkComboBoxText は GtkComboBox のサブクラスですがシンプルバージョンです。
文字列リストに特化しており GtkTreeModel や GtkCellRenderer の処理が不要になっています。

基本的に append_text で文字列を入れるだけで利用できます。
文字列取得は get_active_text を使います。
#!/usr/bin/env python3

from gi.repository import Gtk, Gio

JAPAN =["YAMAHA", "SUZUKI", "HONDA"]

class ComboBoxWin(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        # ComboBox
        self.combobox = Gtk.ComboBoxText.new()
        for s in JAPAN:
            self.combobox.append_text(s)
        # self
        self.add(self.combobox)
        self.connect("delete-event", self.on_quit)
        self.show_all()

    def on_quit(self, widget):
        print(self.combobox.get_active_text())
        Gtk.main_quit()

ComboBoxWin()
Gtk.main()

img/gtk_comboboxtext.png
Copyright(C) sasakima-nao All rights reserved 2002 --- 2017.