BlinkGTK Settings API チュートリアル (Python/PyGObject)

最終更新: 2026-10-21
対象バージョン: BlinkGTK 1.2.5 以降
レベル: 初級〜中級
言語: 日本語 | English


目次

  1. はじめに
  2. PyGObjectのセットアップ
  3. 基本的な使い方
  4. Settings APIの詳細
  5. Pythonicなパターン
  6. 実用例
  7. WebKitGTKからの移行

はじめに

このチュートリアルでは、Python と PyGObject から BlinkGTK の設定 (JavaScript、画像、ローカルストレージ、User-Agent、文字サイズ) を使う方法を学びます。
完全なプログラムは、どれも BlinkGTK 1.2.5 (Chromium 156) で実行して確かめています。

学習内容

以前のチュートリアルのコードを使っていた方へ

以前このページに載っていたコードは、存在しない名前を使っていたため動きませんでした。次のように置き換えてください。

以前の書き方 (存在しない) 正しい書き方
import blink_gtk / blink_gtk.init() from gi.repository import BlinkGTK / BlinkGTK.gtk_init(sys.argv[:1])
app.run() BlinkGTK.gtk_application_run(app)
blink_gtk.shutdown() BlinkGTK.gtk_shutdown()
set_enable_javascript() / get_enable_javascript() set_javascript_enabled() / get_javascript_enabled()
set_auto_load_images() / get_auto_load_images() set_images_enabled() / get_images_enabled()
set_enable_local_storage() / get_enable_local_storage() set_local_storage_enabled() / get_local_storage_enabled()

前提知識


PyGObjectのセットアップ

インストール

BlinkGTK 1.2.5 以降と、Wayland のデスクトップが必要です (1.2.4 までは Python から起動できません。X11 では動きません)。

Fedora:

sudo dnf install python3-gobject gtk4 blinkgtk-bin blinkgtk-bin-gir

Debian / Ubuntu:

sudo apt install python3-gi gir1.2-gtk-4.0
# BlinkGTK 本体と型情報は、ダウンロードした DEB をファイルで指定します (APT のリポジトリはありません)
sudo apt install ./libblinkgtk-0.1-0_<版>-1_amd64.deb ./gir1.2-blinkgtk-0.1_<版>-1_amd64.deb

最初のプログラム

初期化からウィンドウの表示までの最小のプログラムと、その解説は Python チュートリアル にあります。
このページのプログラムも、同じ手順 (BlinkGTK.gtk_init() → BlinkGTK.gtk_application_run() → BlinkGTK.gtk_shutdown()) で動かします。

実行は必ず blinkgtk-run を通してください (例: settings.py として保存し、blinkgtk-run python3 settings.py)。通さないと HTTPS の頁を開いたときに異常終了します (理由)。


基本的な使い方

JavaScript制御

#!/usr/bin/env python3
"""JavaScript を無効にしてページを開く"""
import sys

import gi

gi.require_version("Gtk", "4.0")
gi.require_version("BlinkGTK", "0.1")
from gi.repository import BlinkGTK, Gtk  # noqa: E402


def on_activate(app, url):
    window = Gtk.ApplicationWindow(application=app, title="JavaScript Control")
    window.set_default_size(800, 600)

    web_view = BlinkGTK.WebView.new()
    window.set_child(web_view)

    # 設定はページを読み込む前に行う
    web_view.set_javascript_enabled(False)
    print(f"JavaScript: {'有効' if web_view.get_javascript_enabled() else '無効'}", flush=True)

    # ページのタイトルをウィンドウに出す (スクリプトでタイトルを変えるページで違いが分かる)
    web_view.connect("title-changed", lambda v: window.set_title(v.get_title() or ""))

    window.present()
    web_view.load_uri(url)


def main():
    url = sys.argv[1] if len(sys.argv) > 1 else "https://example.com/"
    ok, _argv = BlinkGTK.gtk_init(sys.argv[:1])
    if not ok:
        print("BlinkGTK を初期化できませんでした", file=sys.stderr)
        return 1
    app = Gtk.Application(application_id="org.example.JavaScriptControl")
    app.connect("activate", on_activate, url)
    rc = BlinkGTK.gtk_application_run(app)
    BlinkGTK.gtk_shutdown()
    return rc


if __name__ == "__main__":
    sys.exit(main())

スクリプトでタイトルを書き換えるページを開くと、タイトルが書き換わらないこと (スクリプトが実行されないこと) を確かめられます。

User-Agent変更

#!/usr/bin/env python3
"""User-Agent を変えてページを開く"""
import sys

import gi

gi.require_version("Gtk", "4.0")
gi.require_version("BlinkGTK", "0.1")
from gi.repository import BlinkGTK, Gtk  # noqa: E402


def on_activate(app, url):
    window = Gtk.ApplicationWindow(application=app, title="User-Agent")
    window.set_default_size(800, 600)

    web_view = BlinkGTK.WebView.new()
    window.set_child(web_view)

    print(f"変更前: {web_view.get_user_agent()}", flush=True)  # 変えていなければ None
    web_view.set_user_agent("MyPythonApp/1.0 (BlinkGTK)")
    print(f"変更後: {web_view.get_user_agent()}", flush=True)

    web_view.connect("title-changed", lambda v: window.set_title(v.get_title() or ""))
    window.present()
    web_view.load_uri(url)


def main():
    url = sys.argv[1] if len(sys.argv) > 1 else "https://example.com/"
    ok, _argv = BlinkGTK.gtk_init(sys.argv[:1])
    if not ok:
        print("BlinkGTK を初期化できませんでした", file=sys.stderr)
        return 1
    app = Gtk.Application(application_id="org.example.UserAgent")
    app.connect("activate", on_activate, url)
    rc = BlinkGTK.gtk_application_run(app)
    BlinkGTK.gtk_shutdown()
    return rc


if __name__ == "__main__":
    sys.exit(main())

注意: 設定した User-Agent は、このあと読み込む頁と、reload() で読み込み直した頁に送られます (HTTP のヘッダと navigator.userAgent)。1.2.4 までは、load_uri() で開いた頁には反映されませんでした。


Settings APIの詳細

設定を変えるタイミング

一覧

設定 変更 取得 既定値
JavaScript set_javascript_enabled(bool) get_javascript_enabled() True
画像の読み込み set_images_enabled(bool) get_images_enabled() True
ローカルストレージ set_local_storage_enabled(bool) get_local_storage_enabled() True
User-Agent set_user_agent(str or None) get_user_agent() None (Chromium の既定値を使用)
既定の文字サイズ (CSS px) set_default_font_size(int) get_default_font_size() 16
最小の文字サイズ (CSS px) set_minimum_font_size(int) get_minimum_font_size() 0 (下限なし)
書体 set_font_family(generic, script, family) get_font_family(generic, script) 未設定なら None

1. JavaScript制御

web_view.set_javascript_enabled(False)   # 無効にする
web_view.set_javascript_enabled(True)    # 有効にする

js_enabled = web_view.get_javascript_enabled()
print(f"JavaScript: {'有効' if js_enabled else '無効'}")

2. User-Agent制御

web_view.set_user_agent("MyApp/1.0 (BlinkGTK)")
print(web_view.get_user_agent())   # "MyApp/1.0 (BlinkGTK)"

web_view.set_user_agent(None)      # 設定を解除する
print(web_view.get_user_agent())   # None

get_user_agent() は、set_user_agent() で設定した文字列を返します。設定していなければ None です。
設定は、このあと読み込む頁と reload() した頁に反映されます (上の注意)。

3. 画像読み込み制御

web_view.set_images_enabled(False)   # 画像を読み込まない
web_view.set_images_enabled(True)    # 画像を読み込む

images_enabled = web_view.get_images_enabled()
print(f"画像の読み込み: {'有効' if images_enabled else '無効'}")

4. ローカルストレージ制御

web_view.set_local_storage_enabled(False)   # localStorage を使わせない
web_view.set_local_storage_enabled(True)

storage_enabled = web_view.get_local_storage_enabled()
print(f"ローカルストレージ: {'有効' if storage_enabled else '無効'}")

5. 文字サイズと書体

web_view.set_default_font_size(24)   # 文字サイズを指定していないページの本文が 24px になる
web_view.set_minimum_font_size(12)   # 12px より小さい文字を 12px にする

# 明朝 (serif) に使う書体を変える。script に None を渡すと、日本語と欧文の両方に設定する
web_view.set_font_family(BlinkGTK.FontGeneric.SERIF, None, "Noto Serif CJK JP")
print(web_view.get_font_family(BlinkGTK.FontGeneric.SERIF, "Jpan"))

Pythonicなパターン

1. 設定をまとめて扱うクラス

from typing import Any


class BrowserSettings:
    """WebView の設定をまとめて扱うクラス"""

    def __init__(self, web_view: BlinkGTK.WebView):
        self.web_view = web_view

    def get_settings(self) -> dict[str, Any]:
        return {
            "javascript": self.web_view.get_javascript_enabled(),
            "images": self.web_view.get_images_enabled(),
            "storage": self.web_view.get_local_storage_enabled(),
            "font_size": self.web_view.get_default_font_size(),
            "user_agent": self.web_view.get_user_agent(),  # 変えていなければ None
        }

    def apply_settings(self, settings: dict[str, Any]) -> None:
        if "javascript" in settings:
            self.web_view.set_javascript_enabled(settings["javascript"])
        if "images" in settings:
            self.web_view.set_images_enabled(settings["images"])
        if "storage" in settings:
            self.web_view.set_local_storage_enabled(settings["storage"])
        if "font_size" in settings:
            self.web_view.set_default_font_size(settings["font_size"])
        if "user_agent" in settings:
            self.web_view.set_user_agent(settings["user_agent"])


# 使用例 (ページを読み込む前に)
settings = BrowserSettings(web_view)
settings.apply_settings({"images": False, "font_size": 20})
print(settings.get_settings())

2. プロパティの使用

class BrowserWindow(Gtk.ApplicationWindow):
    """設定を Python のプロパティとして読み書きするウィンドウ"""

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.web_view = BlinkGTK.WebView.new()
        self.set_child(self.web_view)

    @property
    def javascript_enabled(self) -> bool:
        return self.web_view.get_javascript_enabled()

    @javascript_enabled.setter
    def javascript_enabled(self, enabled: bool) -> None:
        self.web_view.set_javascript_enabled(enabled)

    @property
    def images_enabled(self) -> bool:
        return self.web_view.get_images_enabled()

    @images_enabled.setter
    def images_enabled(self, enabled: bool) -> None:
        self.web_view.set_images_enabled(enabled)


# 使用例 (activate のハンドラの中で)
window = BrowserWindow(application=app)
window.javascript_enabled = False
window.images_enabled = False
print(f"JavaScript: {window.javascript_enabled}")

3. 一時的に設定を変える書き方について

with 文で設定を変え、ブロックを抜けたら元に戻す書き方 (コンテキストマネージャ) は使わないでください。
load_uri() はすぐに戻り、読み込みはその後に進むため、ブロックを抜けた時点で設定を戻すと、どちらの設定で読み込まれるかが決まりません。
読み込みごとに設定を変えたいときは、設定してから load_uri() または reload() を呼びます。


実用例

例1: データセーバーモード

#!/usr/bin/env python3
"""データセーバーモード (JavaScript と画像を止める) を切り替えるブラウザ"""
import sys

import gi

gi.require_version("Gtk", "4.0")
gi.require_version("BlinkGTK", "0.1")
from gi.repository import BlinkGTK, Gtk  # noqa: E402


class DataSaverBrowser(Gtk.ApplicationWindow):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.set_title("Data Saver Browser")
        self.set_default_size(800, 600)

        hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
        for side in ("start", "end", "top", "bottom"):
            getattr(hbox, f"set_margin_{side}")(10)
        hbox.append(Gtk.Label(label="データセーバーモード:"))
        self.data_saver_switch = Gtk.Switch()
        self.data_saver_switch.connect("notify::active", self.on_data_saver_toggled)
        hbox.append(self.data_saver_switch)

        self.web_view = BlinkGTK.WebView.new()
        self.web_view.set_vexpand(True)
        self.web_view.connect("title-changed", lambda v: self.set_title(v.get_title() or ""))

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        vbox.append(hbox)
        vbox.append(self.web_view)
        self.set_child(vbox)

    def on_data_saver_toggled(self, switch, _pspec):
        enabled = switch.get_active()
        self.web_view.set_javascript_enabled(not enabled)
        self.web_view.set_images_enabled(not enabled)
        print(f"データセーバーモード: {'有効' if enabled else '無効'}", flush=True)
        # 表示中のページには、読み込み直したときに反映される
        if self.web_view.get_uri():
            self.web_view.reload()


def on_activate(app, url):
    window = DataSaverBrowser(application=app)
    window.present()
    window.web_view.load_uri(url)


def main():
    url = sys.argv[1] if len(sys.argv) > 1 else "https://example.com/"
    ok, _argv = BlinkGTK.gtk_init(sys.argv[:1])
    if not ok:
        print("BlinkGTK を初期化できませんでした", file=sys.stderr)
        return 1
    app = Gtk.Application(application_id="org.example.DataSaver")
    app.connect("activate", on_activate, url)
    rc = BlinkGTK.gtk_application_run(app)
    BlinkGTK.gtk_shutdown()
    return rc


if __name__ == "__main__":
    sys.exit(main())

スイッチを入れると JavaScript と画像を止めて、ページを読み込み直します。

例2: プロファイルシステム

設定の組み合わせをデータクラスで定義し、ドロップダウンで切り替えます。

#!/usr/bin/env python3
"""設定の組み合わせ (プロファイル) を切り替えるブラウザ"""
import sys
from dataclasses import dataclass

import gi

gi.require_version("Gtk", "4.0")
gi.require_version("BlinkGTK", "0.1")
from gi.repository import BlinkGTK, Gtk  # noqa: E402


@dataclass
class BrowserProfile:
    name: str
    javascript: bool
    images: bool
    storage: bool

    def apply_to(self, web_view: BlinkGTK.WebView) -> None:
        web_view.set_javascript_enabled(self.javascript)
        web_view.set_images_enabled(self.images)
        web_view.set_local_storage_enabled(self.storage)


PROFILES = [
    BrowserProfile("通常", javascript=True, images=True, storage=True),
    BrowserProfile("データセーバー", javascript=False, images=False, storage=True),
    BrowserProfile("プライバシー", javascript=False, images=False, storage=False),
]


class ProfileBrowser(Gtk.ApplicationWindow):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.set_title("Profile Browser")
        self.set_default_size(1000, 700)

        hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10)
        for side in ("start", "end", "top", "bottom"):
            getattr(hbox, f"set_margin_{side}")(10)
        hbox.append(Gtk.Label(label="プロファイル:"))
        self.profile_dropdown = Gtk.DropDown.new_from_strings([p.name for p in PROFILES])
        self.profile_dropdown.connect("notify::selected", self.on_profile_changed)
        hbox.append(self.profile_dropdown)

        self.web_view = BlinkGTK.WebView.new()
        self.web_view.set_vexpand(True)
        self.web_view.connect("title-changed", lambda v: self.set_title(v.get_title() or ""))
        PROFILES[0].apply_to(self.web_view)

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        vbox.append(hbox)
        vbox.append(self.web_view)
        self.set_child(vbox)

    def on_profile_changed(self, dropdown, _pspec):
        profile = PROFILES[dropdown.get_selected()]
        profile.apply_to(self.web_view)
        print(f"プロファイル: {profile.name}", flush=True)
        if self.web_view.get_uri():
            self.web_view.reload()


def on_activate(app, url):
    window = ProfileBrowser(application=app)
    window.present()
    window.web_view.load_uri(url)


def main():
    url = sys.argv[1] if len(sys.argv) > 1 else "https://example.com/"
    ok, _argv = BlinkGTK.gtk_init(sys.argv[:1])
    if not ok:
        print("BlinkGTK を初期化できませんでした", file=sys.stderr)
        return 1
    app = Gtk.Application(application_id="org.example.Profiles")
    app.connect("activate", on_activate, url)
    rc = BlinkGTK.gtk_application_run(app)
    BlinkGTK.gtk_shutdown()
    return rc


if __name__ == "__main__":
    sys.exit(main())

例3: 設定のスイッチ付きブラウザ

JavaScript・画像・ローカルストレージをそれぞれのスイッチで切り替える例は、イベント処理チュートリアル の完全なブラウザにあります。


WebKitGTKからの移行

API対応表

WebKitGTK では WebKit.Settings オブジェクトを介して設定しますが、BlinkGTK は BlinkGTK.WebView に直接設定します。メソッドの名前も異なります。

WebKitGTK (Python) BlinkGTK (Python)
settings.set_enable_javascript(enabled) web_view.set_javascript_enabled(enabled)
settings.get_enable_javascript() web_view.get_javascript_enabled()
settings.set_auto_load_images(enabled) web_view.set_images_enabled(enabled)
settings.get_auto_load_images() web_view.get_images_enabled()
settings.set_enable_html5_local_storage(enabled) web_view.set_local_storage_enabled(enabled)
settings.get_enable_html5_local_storage() web_view.get_local_storage_enabled()
settings.set_default_font_size(size) web_view.set_default_font_size(size)
settings.set_user_agent(ua) web_view.set_user_agent(ua)
settings.get_user_agent() web_view.get_user_agent() (設定していなければ None)

移行例

移行前 (WebKitGTK 6.0):

import gi
gi.require_version("WebKit", "6.0")
from gi.repository import WebKit

web_view = WebKit.WebView()
settings = web_view.get_settings()
settings.set_enable_javascript(False)
settings.set_auto_load_images(False)

移行後 (BlinkGTK):

import gi
gi.require_version("BlinkGTK", "0.1")
from gi.repository import BlinkGTK

# BlinkGTK.gtk_init() を呼んだ後で作る
web_view = BlinkGTK.WebView.new()
web_view.set_javascript_enabled(False)
web_view.set_images_enabled(False)

主な違い:


まとめ

このチュートリアルでは、Python/PyGObject で BlinkGTK の設定を使う方法を学びました。

学んだこと

次のステップ


作成者: BlinkGTK開発チーム
ライセンス: BSD 3-Clause
フィードバック: daisy19@gmail.com