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

目標

 Gtk4で色の選択と選択した色の表示が行えるものの1つとして、Gtk.ColorDialogButtonがあります。このGtk.ColorDialogButtonでは画面に選択中の色を表示しており、その部分をマウスでクリックすると、Gtk.ColorDialogが表示されて別の色を選択することが可能になります。

※ 左図の緑色を表示している箇所が
  Gtk.ColorDialogButton


 今回はGtk.ColorDialogButtonとGtk.ColorDialogButtonを押した時に表示するGtk.ColorDialogをXMLデータで定義する方法と、Gtk.ColorDialogButtonが表示している色情報を取得する方法を紹介します。

Gtk.ColorDialogButtonの定義

 Gtk.ColorDialogButtonの定義は以下のように記入します。以下の例では、プロパティrgbaにより初期の色を、プロパティdialogにより色選択時に使用するGtk.ColorDialogを指定しています。

          <child>
            <object class="GtkColorDialogButton" id="colordialogbutton">
              <property name="rgba">rgb(51,209,122)</property>
              <property name="dialog">colordialog</property>
            </object>
          </child>

Gtk.ColorDialogButtonで呼び出すGtk.ColorDialogの定義

 Gtk.ColorDialogButtonで呼び出すGtk.ColorDialogは、通常のGtk.ColorDialogと同じように定義します。

  </template>
  <object class="GtkColorDialog" id="colordialog">
    <property name="title">色の選択ダイアログ</property>
    <property name="with-alpha">False</property>
  </object>
</interface>

Gtk.ColorDialogButtonで表示されている色情報の取得

 Gtk.ColorDialogButtonに表示されている色の情報は、メソッドget_rgba()によって取得できます。取得できる値(下ではcolor)は、Gdk.RGBA型なので、color.redのように書けばalpha,blue,green,redの値を取得することができます。

@Gtk.Template.Callback()
def on_button_clicked(self, button):
    color = self.colordialogbutton.get_rgba()
    print(f'R={color.red:.3f}, G={color.green:.3f}, B={color.blue:.3f}')

サンプルプログラム

 以下のサンプルプログラムを実行すると左図のようなボタン(Gtk.ColorDialogButtonと’色情報の取得’ボタン)付きのWindowが表示されます。Gtk.ColorDialogButtonを押すと、右図のようなGtk.ColorDialogが表示されます。また、’色情報の取得’ボタンを押すとGtk.ColorDialogButtonに表示されている色情報をターミナルに表示します。

実行方法

 下の2つのファイルを同じフォルダに保存して、そのフォルダで以下のコマンドを実行します。

python main.py
<?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 ColorDialogButton Test</property>
      <child>
        <object class="GtkBox">
          <property name="margin_top">20</property>
          <property name="margin_bottom">20</property>
          <property name="margin_start">20</property>
          <property name="margin_end">20</property>
          <property name="spacing">10</property>
          <child>
            <object class="GtkColorDialogButton" id="colordialogbutton">
              <property name="rgba">rgb(51,209,122)</property>
              <property name="dialog">colordialog</property>
            </object>
          </child>
          <child>
            <object class="GtkButton">
              <property name="label">色情報の取得</property>
              <signal name="clicked" handler="on_button_clicked"/>
            </object>
          </child>
        </object>
      </child>
  </template>
  <object class="GtkColorDialog" id="colordialog">
    <property name="title">色の選択ダイアログ</property>
    <property name="with-alpha">False</property>
  </object>
</interface>
# -*- coding: utf-8 -*-

import gi
import os
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_colordialogbutton'


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

    colordialogbutton = Gtk.Template.Child()

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

    @Gtk.Template.Callback()
    def on_button_clicked(self, button):
        color = self.colordialogbutton.get_rgba()
        print(f'R={color.red:.3f}, G={color.green:.3f}, B={color.blue:.3f}')


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をコピーしました