2021-11-23

PyGObject と GTK4

GObject (GLib Object System) は、GTK+ のすべてのウィジェットおよび関連するオブジェクトの基底クラスからなるオブジェクトシステムと、言語間の透過的相互運用性を提供するライブラリです。GObject は C 言語で実装されており、バインディングによって他の言語から利用可能となっています。

PyGObject は GObject へのバインディングを提供する Python パッケージです。

Wikipedia より引用・編集

このところ GUI プログラミングは Qt for Python (PySide) ばかりですが、久しぶりに PyGObject を触ってみました。GTK4 がリリース(2020 年 12 月 16 日)されてからずいぶんと経つので、PyGObject も既に GTK4 に対応しているだろうと思ったからです。

本記事では、下記の OS 環境を使用しています。

Fedora 35 Workstation x86_64
Python 3.10.0
PyGObject 3.42.0

GTK3 の場合

最初に従来の GTK3 を利用したサンプルです。

hello_gtk3.py
# Reference
# https://python-gtk-3-tutorial.readthedocs.io/en/latest/introduction.html#simple-example
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
class Hello(Gtk.Window):
def __init__(self):
super().__init__(title='Hello World')
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.add(box)
button = Gtk.Button(label='こんにちは、世界!')
button.connect('clicked', self.on_button_clicked)
box.pack_start(button, True, True, 0)
def on_button_clicked(self, widget):
print('Hello World! (GTK+ %s.%s.%s)' % (Gtk.MAJOR_VERSION, Gtk.MINOR_VERSION, Gtk.MICRO_VERSION))
def main():
hello = Hello()
hello.connect("destroy", Gtk.main_quit)
hello.show_all()
Gtk.main()
if __name__ == '__main__':
main()
view raw hello_gtk3.py hosted with ❤ by GitHub

下記に実行例を示しました。

Hello World! (GTK 3.24.30)

GTK4 の場合

最新の PyGObject では GTK4 も利用できましたが、上記 GTK3 のサンプルをそのままでは実行できなかったので、参考になるサイトを探して、同じように動作するサンプルを作ってみました。

hello_gtk4.py
# References
# https://www.gtk.org/docs/language-bindings/python
# https://palepoli.skr.jp/wp/2021/05/03/gtk4-python-001/
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk
class Hello(Gtk.Window):
def __init__(self, app):
Gtk.Window.__init__(self, application=app, title="Hello World")
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.set_child(box)
button = Gtk.Button(label='こんにちは、世界!')
button.connect('clicked', self.on_button_clicked)
box.append(button)
self.present()
def on_button_clicked(self, widget):
print('Hello World! (GTK+ %s.%s.%s)' % (Gtk.MAJOR_VERSION, Gtk.MINOR_VERSION, Gtk.MICRO_VERSION))
class MyApplication(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self, application_id='com.blogspot.bitwalk')
def do_activate(self):
Hello(self)
def main():
app = MyApplication()
app.run()
if __name__ == '__main__':
main()
view raw hello_gtk4.py hosted with ❤ by GitHub

下記に実行例を示しました。GTK3 のサンプルとは微妙にサイズが異なります。Box のレイアウトでパッキングが効かないようです。

Hello World! (GTK 4.4.1)

マニュアルやチュートリアルを探しましたが、PyGObject の GTK4 向けの詳しい情報が見つけられませんでした。ひきつづき探索を続けます。

GUI ライブラリに何を使いたいのか

最近使うことがすっかり多くなった Qt (PySide2/6) は、Windows でも Linux でも使えるクロスプラットフォームのライブラリで、ドキュメントも(英語ですが)充実していてとても便利です。実際、業務では Qt を使っています。

Windows 上で PyGObject を利用するとなれば MSYS2 をインストールしなければならず、結局 PySide2 (Qt) に切り替えた過去があります。一方、個人用途では Fedora Linux を使っているので、GUI の Look & Feel が GNOME と同じ PyGObject をもっと使いたいとも思っています。

Python で GUI プログラミングをするときには選択肢が複数ある、という贅沢を味わえるので、、下記のライブラリ(ツールキット)を用途に応じて使い分けられることが理想と考えています。

参考サイト

  1. The GTK Project - A free and open-source cross-platform widget toolkit
  2. GTK4 Python 001 | Paepoi Blog [2021-05-03]

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ Linuxへ
にほんブログ村

0 件のコメント: