Gtk.ComboBoxTextについて
Gtk.ComboBoxTextは、ユーザーに選択肢の中からテキストを選択してもらう時などに使用するWidgetです。Gtk.ComboBoxTextは、Gtk4.10より非推奨となりましたが、Gtk4では使用することが可能なWidgetです。(代替Widgetは、Gtk.DorpDownです。)
Gtk.ComboBoxTextをXMLデータにより作成する場合は、Gtk.ComboBoxTextのデフォルトで表示される部分だけでなく、クリックすると表示される選択肢も指定することができます。
今回は、XMLデータでGtk.ComboBoxTextを作成や選択肢の追加の方法について紹介します。
今回紹介する内容
・ XMLデータでのGtk.ComboBoxTextの作成
・ XMLデータでのGtk.ComboBoxTextへの選択肢の追加
・ XMLデータでのGtk.ComboBoxTextの初期値の指定
XMLデータでのGtk.ComboBoxTextの作成
Gtk.ComboBoxTextの作成
XMLデータでGtk.ComboBoxTextを作成する場合は、それを載せるWidgetの<child></child>の中に <object class=”ComboBoxText” ></object>と記入して、その中にプロパティやレイアウトを記入します。
<child>
<object class="GtkComboBoxText" id="combo">
# 省略
</object>
</child>
Gtk.ComboBoxTextへの選択肢の追加
Gtk.ComboBoxTextの選択肢は <item id=”num1″>Number 1</item>のように記入して、それらを表示するGtk.ComboBoxTextの中の<items></items>で囲んだ範囲に記入します。
各項目の<item>要素 には、追加されたテキストに対応する「id」が指定でき、他にも「translatable」、「context」、および「comments」を使用できます。
<child>
<object class="GtkComboBoxText" id="combo">
<items>
<item id="num1">Number 1</item>
<item id="num2">Number 2</item>
<item id="num3">Number 3</item>
<item id="num4">Number 4</item>
</items>
<property name="active">2</property>
# 省略
</object>
</child>
Gtk.ComboBoxTextの初期値の指定
XMLデータでGtk.ComobBoxTextの項目を追加した場合でも、Gtk.ComoboBoxTextの初期値は、以下のようにプロパティactiveを使用して指定できます。
activeの値はint型であり、<item></item>に記入した順番(0からスタート)を指定します。
<property name="active">2</property>
サンプルプログラム
以下のサンプルプログラムを実行すると図のようなコンボボックステキストが表示されます。コンボボックステキストの中には、”Number 1″, “Number 2”, “Number 3”, “Number 4” の4つの項目が含まれており、初期値には”Number 3″が指定されています。
コンボボックステキストの項目を変更した場合、選択した項目がターミナルに表示されます。
実行方法
下の2つのファイルを同じフォルダに保存して、そのフォルダで以下のコマンドを実行します。
python main.py
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="window" parent="GtkWindow">
<property name="default_width">600</property>
<property name="default_height">250</property>
<property name="title">Template ComboBoxText Test</property>
<child>
<object class="GtkGrid" id="grid">
<property name="hexpand">True</property>
<property name="margin-bottom">10</property>
<property name="margin-end">10</property>
<property name="margin-start">10</property>
<property name="margin-top">10</property>
<property name="column_spacing">10</property>
<property name="row_spacing">10</property>
<property name="vexpand">True</property>
<child>
<object class="GtkLabel" id="label5">
<property name="label">①コンボボックステキスト</property>
<property name="xalign">0.0</property>
<property name="width_request">230</property>
<layout>
<property name="column">0</property>
<property name="row">4</property>
</layout>
</object>
</child>
<child>
<object class="GtkComboBoxText" id="combo">
<items>
<item id="num1">Number 1</item>
<item id="num2">Number 2</item>
<item id="num3">Number 3</item>
<item id="num4">Number 4</item>
</items>
<property name="active">2</property>
<signal name="changed" handler="on_combo_changed"/>
<layout>
<property name="column">1</property>
<property name="row">4</property>
<property name="column_span">2</property>
</layout>
</object>
</child>
</object>
</child>
</template>
</interface>
import os
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk
APPID = 'com.github.taniyoshima.g4_fblogt_cellrendertext'
@Gtk.Template(filename=os.path.dirname(__file__) + '/ui_file.ui')
class Gtk4TestTest(Gtk.Window):
__gtype_name__ = "window"
store = Gtk.Template.Child()
def __init__(self, app):
Gtk.Window.__init__(
self, application=app)
@Gtk.Template.Callback()
def on_cursor_changed(self, treeview):
treeselection = treeview.get_selection()
model, iter = treeselection.get_selected()
if iter:
print(
model.get_value(iter, 0),
model.get_value(iter, 1),
model.get_value(iter, 2))
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()