[Gtk.Template]Gtk.DropDownの使用について

XMLデータにより定義したGtk.DropDownの使用

 Gtk.DropDownは、オプションのリストから項目を選択できるようにするウィジェットであり、作成する場合にはGtk.DropDownの他にオプションのリストとなるモデルも作成する必要があります。こられは、XMLデータでも作成することができます。

 今回は、Gtk.DropDownやGtk.DropDownに追加するアイテムをXMLデータで作成する方法を紹介します。

今回紹介する内容
 ・ XMLデータでGtk.DropDownを作成する
 ・ XMLデータでGtk.DropDown用のモデルを作成する

XMLデータでのGtk.DropDownの記入

XMLデータでGtk.DropDownを作成する

 Gtk.DropDownは以下のように記入します。今回はプロパティmodelにより使用するモデルの指定をおこない、シグナルnotify::selected(オプションのリストから項目を選択したことを伝える)と関数on_dropdown_selectedとの紐付けをしています。

      <child>
        <object class="GtkDropDown">
          <property name="model">model
            <object class="GtkStringList" id= "model">
              <items>
                <item>項目1</item>
                <item>項目2</item>
                <item>項目3</item>
              </items>
            </object>
          </property>
          <property name="margin_top">20</property>
          <property name="margin_bottom">20</property>
          <property name="margin_start">20</property>
          <property name="margin_end">20</property>
          <signal name="notify::selected" handler="on_dropdown_selected"/>
        </object>
      </child>

XMLデータでGtk.DropDown用のモデルを作成する

 Gtk.DropDownのモデルの型はGio.ListModelなので、Gio.ListModelを継承したGtk.StringListを使用します。Gtk.StringListは、プロパティmodelの中に以下のように記入します。

          <property name="model">model
            <object class="GtkStringList" id= "model">
              <items>
                <item>項目1</item>
                <item>項目2</item>
                <item>項目3</item>
              </items>
            </object>
          </property>

サンプルプログラム

 以下のサンプルプログラムを実行するとGtk.DropDown付きのWindowが表示されます。Gtk.DropDownで項目を選択すると、ターミナルに選択した項目の情報が表示されます。

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <template class="window" parent="GtkApplicationWindow">
      <property name="default_width">400</property>
      <property name="default_height">80</property>
      <property name="title">Template Dropdown Test</property>
      <child>
        <object class="GtkDropDown">
          <property name="model">model
            <object class="GtkStringList" id= "model">
              <items>
                <item>項目1</item>
                <item>項目2</item>
                <item>項目3</item>
              </items>
            </object>
          </property>
          <property name="margin_top">20</property>
          <property name="margin_bottom">20</property>
          <property name="margin_start">20</property>
          <property name="margin_end">20</property>
          <signal name="notify::selected" handler="on_dropdown_selected"/>
        </object>
      </child>
  </template>
</interface>
# -*- coding: utf-8 -*-

import gi
import os
from bs4 import BeautifulSoup
import logging
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk, Gio, GLib  # noqa E402


logging.basicConfig(
    level=logging.DEBUG, format='[%(levelname)s]: %(message)s')

logging.disable(logging.CRITICAL)

APPID = 'com.github.taniyoshima.g4_fblogt_dropdown'


@Gtk.Template(filename=os.path.dirname(__file__) + '/ui_file.ui')
class Gtk4TestTest(Gtk.ApplicationWindow):
    __gtype_name__ = "window"

    model = Gtk.Template.Child()

    def __init__(self, app):
        Gtk.Window.__init__(
            self, application=app)

    @Gtk.Template.Callback()
    def on_dropdown_selected(self, dropdown, gparam):
        num = dropdown.get_selected()
        print('番号:{}  値:{}'.format(num, self.model.get_string(num)))


class Gtk4TestApp(Gtk.Application):

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

    def do_startup(self):
        Gtk.Application.do_startup(self)

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


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


if __name__ == '__main__':
    main()
タイトルとURLをコピーしました