[Python,Gtk4] Gtk.ComboBoxTextの使用について

目的

 Gtk.ComboBoxTextは、Gtk4.10より非推奨となったWidgetですが、Gtk4では利用し続けることが可能なので、その使い方を見ていきます。代替Widgetは、Gtk.DorpDownです。

 今回は、Gtk.ComboBoxTextに①項目を追加する方法、②テキスト入力を可能にする方法、③Gtk.ComboBoxTextに表示されている値の取得方法を見ます。

Gtk.ComboBoxTextの設定

 Gtk.ComboBoxTextの外観や動作、項目の操作は、プロパティやメソッドを使用して指定します。

項目を追加する

 Gtk.ComboBoxTextへ順番に項目を追加するのにはメソッドappend_text()を使用します。その他にも項目の操作には、append()、insert()、insert_text()、prepend()、prepend_text()、remove()、remove_all()があります。

テキスト入力を可能にする

 Gtk.ComboBoxTextをテキスト入力可能にするのには、定義時にメソッドnew_with_entry()や、プロパティhas_entryを使用します。
 プロパティで指定する場合、テキスト入力を可能にするのは「has_entry=True」となります。ハイフンでは無く、アンダーバーを使用していることにご注意ください。

表示している値を取得する

 Gtk.ComboBoxTextに表示した値を取得するのには、メソッドget_active_text()を使用します。このメソッドは、項目が選択されていたらそれを(型:str)を、選択されていなければNoneを返します。

Gtk.ComboBoxTextのサンプルプログラム

 以下のサンプルプログラムを実行すると、下図のような2組のGtk.LabelとGtk.ComboBoxText、GtkButtonが表示されます。①テキスト入力不可横のGtk.ComboBoxTextは、選択を変更した場合にターミナルに選択した項目を表示します。②テキスト入力可横のGtk.ComboBoxText(combo2)は登録した選択肢の他にテキスト入力が可能になっています。Gtk.Button(ラベルが「取得」のもの)を押すと、combo2に表示されている文字をターミナルに表示します。

import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk


APPID = 'com.github.taniyoshima.g4_fblog_comboboxtext'


class Gtk4TestTest(Gtk.Window):

    def __init__(self, app):
        Gtk.Window.__init__(
            self, application=app, title='Gtk.ComboboxTex Test')

        grid = Gtk.Grid(
            width_request=350, height_request=200,
            margin_top=20, margin_bottom=20,
            margin_start=20, margin_end=20,
            column_spacing=30, row_spacing=30,
            hexpand=True, vexpand=True,
        )

        label1 = Gtk.Label(label='①テキスト入力不可', xalign=0.0)

        num = [
            'number 1',
            'number 2',
            'number 3',
        ]

        combo1 = Gtk.ComboBoxText()
        combo1.connect("changed", self.on_combo1_changed)
        for data in num:
            combo1.append_text(data)

        combo1.set_active(0)

        label2 = Gtk.Label(label='②テキスト入力可', xalign=0.0)

        moji = [
            'AAA',
            'BBB',
            'CCC',
        ]
        self.combo2 = Gtk.ComboBoxText.new_with_entry()
        for data in moji:
            self.combo2.append_text(data)

        button = Gtk.Button(label='取得')
        button.connect('clicked', self.on_button_clicked)

        grid.attach(label1, 0, 0, 1, 1)
        grid.attach(combo1, 1, 0, 1, 1)
        grid.attach(label2, 0, 1, 1, 1)
        grid.attach(self.combo2, 1, 1, 1, 1)
        grid.attach(button, 1, 2, 1, 1)

        self.set_child(grid)

    def on_combo1_changed(self, combo):
        text = combo.get_active_text()
        if text is not None:
            print("Combo1の値 : %s" % text)

    def on_button_clicked(self, button):
        text = self.combo2.get_active_text()
        if text == '':
            print('Combo2は、選択及び入力がされていません')
        else:
            print("Combo2の値 : %s" % text)


class Gtk4TestApp(Gtk.Application):

    def __init__(self):
        Gtk.Application.__init__(self, application_id=APPID)

    def do_activate(self):
        window = Gtk4TestTest(self)
        window.present()


def main():
    app = Gtk4TestApp()
    app.run()


if __name__ == '__main__':
    main()

31〜36行目 combo1(①テキスト入力不可のコンボボックス)の定義
 32行目 シグナル”changed”と関数on_combo1_changedとの紐付け
 33〜34行目 combo1への項目の追加
 36行目 初期値を設定する
45〜47行目 self.combo2(②テキスト入力可のコンボボックス)の定義
 関数on_button_clickedで使用するため、self.combo2にしています。
 45行目 entryを持つGtk.ComboBoxTextの定義
 46〜47行目 self.combo2への項目の追加
60〜63行目 関数on_combo1_chenged()
 combo1を変更した場合の処理:combo1の値をターミナルに表示します。
65〜70行目 関数on_button_clicked()
 buttonを押した場合の処理:self.combo2の値をターミナルに表示します。

まとめ

  • Gtk.ComboBoxTextへの項目の(実行した順番に)追加には、メソッドappend_text()を使用します。
  • Gtk.ComboBoxTextをテキスト入力可能にするのには、定義時にメソッドnew_with_entry()や、プロパティhas_entryを使用します。
  • Gtk.ComboBoxTextに表示した値を取得するのには、メソッドget_active_text()を使用します。

 次回の予定

 次回は、Gtk.ComboBoxの使用方法について見ていきます。

タイトルとURLをコピーしました