GObject (GLib Object System) は、GTK+ のすべてのウィジェットおよび関連するオブジェクトの基底クラスからなるオブジェクトシステムと、言語間の透過的相互運用性を提供するライブラリです。GObject は C 言語で実装されており、バインディングによって他の言語から利用可能となっています。
PyGObject は GObject へのバインディングを提供する Python パッケージです。
自分で作る GUI アプリの用途
私は、主にデータ解析の分野に Python を利用しています。最初に JupyterLab でデータの解析やグラフなどを作成しますが、ある程度頻繁に似たような解析をするようになると、処理を定形化するために GUI 化します。たびたび、本ブログでも記事にしているように、Python で GUI アプリを作るにはもっぱら PySide (Qt for Python) を利用しています。
ただ、Python の GUI ライブラリは他にもあるので、状況に応じて他の主要な GUI ライブラリも使えるようにしておこうと、wxPython や PyGObject も試しています。
PyGObject については、GTK-3 が主流のころに使い始めたのですが、Gtk-4 になって記述の仕方が少々変わってしまいました [1]。当初、参考にできるサイトが少なかったこともあって、だんだんと疎遠になってしまっていました。
最近になって、PyGObject/GTK-4 を利用したサンプルを解説付きで公開しているサイトを見つけました(参考サイト[2])。大変判りやすくまとめてあるサイトです。大いに刺激を受けたので、サイトを参考にさせていただきながら、むかし作成した PyGObject/GTK-3 用のサンプルを GTK-4 用に書き直して始めています。
今回は、前述の参考サイトとカブらない内容のサンプルを紹介します。
PyGOPbject/GTK-4 上で Matplotlinb のプロットを扱う
本記事では、下記の OS 環境を使用しています。
![]() |
Fedora Workstation 39 | x86_64 |
Python | 3.12.0 | |
PyGObject | 3.46.0 | |
matplotlib | 3.8.2 |
ちなみに、Fedora Linux の場合、Python の venv で仮想環境を作って pip で PyGObject をインストールすると、コンパイラでビルドすることになるので、あらかじめ必要なパッケージをインストールしておく必要があります。
仮に Fedora Worksation 39 をインストールした直後であれば、下記のように、パッケージを追加でインストールする必要があります。
$ sudo dnf install cairo-devel cairo-gobject-devel gcc gobject-introspection-devel python3-devel
下記に Matplotlib でプロットするサンプルを示しました。
#!/usr/bin/env python | |
# coding: utf-8 | |
import gi | |
gi.require_version('Gtk', '4.0') | |
from gi.repository import Gtk | |
from matplotlib.backends.backend_gtk4agg import ( | |
FigureCanvasGTK4Agg as FigureCanvas | |
) | |
from matplotlib.figure import Figure | |
import pandas as pd | |
APPID = 'com.blogspot.bitwalk' | |
def get_example_chart() -> Figure: | |
# example dataframe | |
df = pd.DataFrame({ | |
'Sample': list(range(1, 11)), | |
'Y': [9.030, 8.810, 9.402, 8.664, 8.773, 8.774, 8.416, 9.101, 8.687, 8.767] | |
}) | |
fig = Figure(dpi=100) | |
ax = fig.add_subplot( | |
title='Plot sample', | |
xlabel='Sample', | |
ylabel='Value', | |
) | |
ax.plot( | |
df['Sample'], | |
df['Y'], | |
color='red', | |
marker='o', | |
markersize=5, | |
) | |
ax.grid(True) | |
return fig | |
class Example(Gtk.Window): | |
def __init__(self, app): | |
Gtk.Window.__init__( | |
self, | |
application=app, | |
title='Matplotlib', | |
default_width=600, | |
default_height=500, | |
) | |
swin = Gtk.ScrolledWindow( | |
margin_top=2, | |
margin_bottom=2, | |
margin_start=2, | |
margin_end=2, | |
) | |
self.set_child(swin) | |
figure = get_example_chart() | |
canvas = FigureCanvas(figure) | |
# canvas.set_size_request(600, 480) | |
swin.set_child(canvas) | |
class MyApplication(Gtk.Application): | |
def __init__(self): | |
Gtk.Application.__init__(self, application_id=APPID) | |
def do_activate(self): | |
win = Example(self) | |
win.present() | |
def main(): | |
app = MyApplication() | |
app.run() | |
if __name__ == '__main__': | |
main() |
下記のようにして上記サンプルを実行します。
(venv) $ python gtk_matplotlib.py
どこかに書いてあるというわけではないのですが、GTK-4 は Qt のような多機能なライブラリを目指しているとは思えません。むしろ無駄な機能をそぎ落とし続けているようにも感じます。
GUI でいつも利用するコンポーネント(ウィジェット)は案外そう多くないように思います。それに自分は Fedora Workstation をメインの PC として愛用しているので、Qt よりも GTK の方が GNOME のデスクトップ環境と相性が良いのです。自分が GUI に求めてる機能とうまく折り合いをつけられれば、PyGObject をもっと使うようになるかもしれません。
参考サイト
- bitWalk's: PyGObject と GTK4 [2021-11-23]
- Gtk4とPythonでプログラムを作成するための内容をまとめたものです。 | Pythonでいろいろ作って遊んでます
- Overview — PyGObject
- The GTK Project - A free and open-source cross-platform widget toolkit
- Gtk – 4.0

にほんブログ村
#オープンソース

0 件のコメント:
コメントを投稿