GObject (GLib Object System) は、GTK+ のすべてのウィジェットおよび関連するオブジェクトの基底クラスからなるオブジェクトシステムと、言語間の透過的相互運用性を提供するライブラリです。GObject は C 言語で実装されており、バインディングによって他の言語から利用可能となっています。
PyGObject は GObject へのバインディングを提供する Python パッケージです。
このところ 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 を利用したサンプルです。
# 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() |
下記に実行例を示しました。
Hello World! (GTK 3.24.30)
GTK4 の場合
最新の PyGObject では GTK4 も利用できましたが、上記 GTK3 のサンプルをそのままでは実行できなかったので、参考になるサイトを探して、同じように動作するサンプルを作ってみました。
# 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() |
下記に実行例を示しました。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 プログラミングをするときには選択肢が複数ある、という贅沢を味わえるので、、下記のライブラリ(ツールキット)を用途に応じて使い分けられることが理想と考えています。
- PySide (Qt for Python)
- PyGObject
- wxPython
参考サイト
- The GTK Project - A free and open-source cross-platform widget toolkit
- GTK4 Python 001 | Paepoi Blog [2021-05-03]

にほんブログ村
0 件のコメント:
コメントを投稿