[Gtk.Template]Gtk.AboutDialogの使用

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

 Gtk.AboutDialogは、Gtk4のプログラムでプログラムの詳細やライセンス、作者の情報を表示するのに使用するWidgetです。Gtk.AboutDialogもXMLデータで作成することが可能であり、その呼び出して表示したり、閉じたりする処理はPython側に記入します。

 今回は、Gtk.AboutDialogをXMLデータで作成する方法とその呼び出しや閉じる方法について紹介します。

今回紹介する内容
 ・ XMLデータでGtk.AboutDialogを作成する
 ・ Gtk.AboutDialogを表示する
 ・ Gtk.AboutDialogを閉じる

XMLデータでのGtk.AboutDialogの記入と処理

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

 Gtk.AboutDialogの定義は以下のように記入します。

 ・ </template>と</interface>の間に記入する。
 ・ <object class=”GtkAboutDialog” id=”(id名)”>と</object>を書き、
   その間にプロパティなどを記入する。
 ・ プロパティlogoにファイルを指定する場合、XMLと同じフォルダならば
   ファイル名を記入する。
 ・ プロパティtransient-forの値は、id名で指定します。
 ・ Gtk.AboutDialogを閉じる処理の関数を指定するために、<single name …/>を記入します。 

 ※ プロパティの内容については、[Python,Gtk4] Gtk.AboutDialogの使用について
   参照してください。

<object class="GtkAboutDialog" id="aboutdialog">
    <property name="authors">taniyoshima</property>
    <property name="comments">AboutDialogのサンプル</property>
    <property name="license_type">mit-x11</property>
    <property name="version">1.0.0</property>
    <property name="program_name">Template AboutDialog Test</property>
    <property name="logo">icon.png</property>
    <property name="transient-for">window</property>
    <property name="modal">True</property>
    <signal name="close_request" handler="on_dialog_closereq"/>
</object>

Gtk.AboutDialogを表示する

 Gtk.AboutDialogの表示は、aboutdialog = Gtk.Template.Child()によりXMLデータで作成したGtk.AboutDialogを取得して、それに対してset_visible(True)を指定することでおこないます。

    aboutdialog = Gtk.Template.Child()

@Gtk.Template.Callback()
def on_button_clicked(self, button):
    self.aboutdialog.set_visible(True)

Gtk.AboutDialogを閉じる

 Gtk.AboutDialogを閉じる処理は、閉じるGtk.AboutDialogに対してset_visible(False)を指定することでおこないます。
 サンプルプログラムでは、on_dialog_closereqの引数dialogにより、閉じるGtk.AboutDialogが渡されるので、それに対してset_visible(False)を指定しています。

@Gtk.Template.Callback()
def on_dialog_closereq(self, dialog):
    dialog.set_visible(False)

サンプルプログラム

 以下のサンプルプログラムを実行すると左図のようなボタン(AboutDialog表示)付きのWindowが表示されます。そのボタンを押すと、右図のようなGtk.AboutDialogを表示します。

実行方法

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

python main.py
<?xml version="1.0" encoding="UTF-8"?>
<interface>
    <template class="window" parent="GtkWindow">
        <property name="default_width">500</property>
        <property name="default_height">70</property>
        <property name="title">Template AboutDialog Test</property>
            <child>
                <object class="GtkButton" id="button">
                    <property name="label">AboutDialog表示</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="clicked" handler="on_button_clicked"/>
                </object>
            </child>
    </template>
    <object class="GtkAboutDialog" id="aboutdialog">
        <property name="authors">taniyoshima</property>
        <property name="comments">AboutDialogのサンプル</property>
        <property name="license_type">mit-x11</property>
        <property name="version">1.0.0</property>
        <property name="program_name">Template AboutDialog Test</property>
        <property name="logo">icon.png</property>
        <property name="transient-for">window</property>
        <property name="modal">True</property>
        <signal name="close_request" handler="on_dialog_closereq"/>
    </object>
</interface>
import os
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk


APPID = 'com.github.taniyoshima.g4_fblogt_aboutdialog'


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

    aboutdialog = Gtk.Template.Child()

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

    @Gtk.Template.Callback()
    def on_button_clicked(self, button):
        self.aboutdialog.set_visible(True)

    @Gtk.Template.Callback()
    def on_dialog_closereq(self, dialog):
        dialog.set_visible(False)


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()
タイトルとURLをコピーしました