[Python,Gtk4] Gtk.ApplicationやGtk.ApplicationWindowのクラスを継承して使用

Gtk.ApplicationやGtk.ApplicationWindowのクラスを継承して使用

 公式のサンプルプログラムはコンパクトなものであり、on_activate()にウィンドウの情報をすべて入力しています。この書き方では、複数のWidgetをGtk.ApplicationWindowに載せたり、buttonを押した場合に複雑な処理を追加をおこなったりする場合には、可読性が悪くなります。

 これを解決する方法に、Gtk.ApplicationクラスやGtk.ApplicationWindowクラスを継承したものを作成して、その中に記入するというものあります。この方法を使用すると、Gtk.ApplicationWindowに載せるWidgetは、Gtk.ApplicationWindowの__init__にまとめて記述することになり、そこに載せたWidgetのイベントもクラス内のメソッドとして記入するため、可読性が改善されます。

 今回は、公式のサンプルプログラムをGtk.ApplicationやGtk.ApplicationWindowのクラスを継承したものに変更して、複数のWidgetの追加や複雑な処理を行う関数の追加に対応し易いようにします。

今回紹介する内容
 ・ Gtk.Applicationのクラスを継承する
 ・ Gtk.ApplicationWindowのクラスを継承する
 ・ Gtk.ApplicationWindowを継承したクラスにイベントを記入する

Gtk.ApplicationやGtk.ApplicationWindowのクラスの継承

Gtk.Applicationのクラスを継承する

 Gtk.Applicationのクラスを継承する場合は、以下の内容を記入します。
 ・ def __ini__(self): スーパークラスであるGtk.Applicationにapplication_idの値を送る
 ・ def do_activate(self): windowの作成(Gtk4Helloworldのインスタンス作成)して表示する

class Gtk4HelloworldApp(Gtk.Application):

    def __init__(self):
        Gtk.Application.__init__(
            self, application_id='com.github.taniyoshima.g4_helloworld')

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

Gtk.ApplicationWindowのクラスを継承する

 Gtk.Applicationのクラスを継承する場合は、以下の内容を記入します。
 ・ def __init__(self, app): への記入内容
  1. スーパークラスであるGtk.ApplicationWindowに引数applicationの値を送る。
  2. Gtk.ApplicatioWindowに載せるWidgetの内容を記入する。

class Gtk4Helloworld(Gtk.ApplicationWindow):

    def __init__(self, app):
        Gtk.ApplicationWindow.__init__(
            self, application=app)
        # btnの追加 (ここに載せるWidgetを記入する)
        btn = Gtk.Button(label="Hello, World!")
        btn.connect('clicked', self.on_button_clicked)
        self.set_child(btn)

Gtk.ApplicationWindowを継承したクラスにイベントを記入する

 Gtk.ApplicationWindowに載せたボタンなどのシグナルと紐づける関数は、作成したクラスのメソッドとして以下のように記入します。

    def on_button_clicked(self, button):
        self.close()

サンプルプログラム

使用方法

 下記プログラムをファイル名main.pyで任意のフォルダに保存して、同じフォルダ内で以下のコマンドを入力してエンターを押すと、プログラムが実行されます。

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

class Gtk4Helloworld(Gtk.ApplicationWindow):

    def __init__(self, app):
        Gtk.ApplicationWindow.__init__(
            self, application=app)
        # btnの追加 (ここに載せるWidgetを記入する)
        btn = Gtk.Button(label="Hello, World!")
        btn.connect('clicked', self.on_button_clicked)
        self.set_child(btn)

 # btnを押した場合の処理
    def on_button_clicked(self, button):
        self.close()


class Gtk4HelloworldApp(Gtk.Application):

    def __init__(self):
        Gtk.Application.__init__(
            self, application_id='com.github.taniyoshima.g4_helloworld')

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


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


if __name__ == '__main__':
    main()
Gtk.ApplicationWindowクラスを継承したGtk4Helloworldクラスを作成しています。
Gtk.ApplicationWindowの関数__init__()内で、btnを作成しています。
btnの'clicked'シグナルは、ラムダ式では無く、関数self.on_button_clicked()を呼び出して、
そこでself.close()処理をしています。

Gtk.Applicationクラスを継承したGtk4HelloworldAppクラスを作成しています。
Gtk.Applicationの関数__init__()内で、applicatio_idを指定します。
Gtk.Applicationの関数on_activate()内で、Gtk4Helloworldクラスを呼び出し、windowを表示します。
 ※ Gtk.Applicationクラスを継承しているので、公式のよう'active'シグナルと関数on_connect
   とを接続する必要はありません。すでに設定されています。
 ※ 公式のサンプルが関数on_activate内で実施していた内容をGtk4Helloworldに記述しています。
タイトルとURLをコピーしました