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に記述しています。