PyGTKでコンボボックスを使う

Pythonのバージョンは2.7、PyGTKのバージョンは2.24。
PyGTKでコンボボックスを使うには、ComboBoxクラスを使う。アイテムの管理にListStoreクラスを使ったりする。
レンダラーの紐付けまで必要になるので、はまりやすそう。

gtk_combobox.py

コンボボックスを使う以外は昨日のコードと同じ。

# coding: utf-8
import pygtk
pygtk.require('2.0')
import gtk
import gobject


class MyApp(object):
    def __init__(self):
        self.window = gtk.Window()

        # コンボボックス用ListStore(文字列のカラム1列)
        self.liststore = gtk.ListStore(gobject.TYPE_STRING)
        for i in range(5):
            self.liststore.append([u"アイテム%d" % i])
        # コンボボックス用テキストレンダラを用意
        cell = gtk.CellRendererText()
        # コンボボックス
        self.combobox = gtk.ComboBox(self.liststore)
        self.combobox.pack_start(cell, True)
        self.combobox.add_attribute(cell, 'text', 0)
        # 3つめのアイテムを選択状態にする
        self.combobox.set_active(2)

        # OKボタン
        self.button_ok = gtk.Button('OK')
        self.button_ok.connect('clicked', self.on_button_ok_clicked)

        # レイアウト用ボックス
        self.vbox = gtk.VBox()
        self.vbox.add(self.combobox)
        self.vbox.add(self.button_ok)

        self.window.add(self.vbox)
        self.window.connect('delete-event', self.on_delete_event)

    def on_delete_event(self, window, event, data=None):
        """ウィンドウ閉じる
        """
        gtk.main_quit()
        return False

    def on_button_ok_clicked(self, widget, data=None):
        """ボタンクリック
        """
        self.messagebox(u'選択した内容は %s です。' % self.combobox.get_active_text())

    def messagebox(self, text):
        """メッセージボックス
        """
        dialog = gtk.MessageDialog(
            self.window,
            gtk.DIALOG_MODAL,
            gtk.MESSAGE_INFO,
            gtk.BUTTONS_OK,
            text,
        )
        dialog.run()
        dialog.destroy()

    def main(self):
        # 画面を表示してメインループに入る
        self.window.show_all()
        gtk.main()


if __name__ == '__main__':
    app = MyApp()
    app.main()

実行結果

$ python gtk_combobox.py