最終更新: 2026-10-21
対象バージョン: BlinkGTK 1.2.5 以降
レベル: 初級〜中級
言語: 日本語 | English
このチュートリアルでは、Python と PyGObject から BlinkGTK の設定
(JavaScript、画像、ローカルストレージ、User-Agent、文字サイズ)
を使う方法を学びます。
完全なプログラムは、どれも BlinkGTK 1.2.5 (Chromium 156)
で実行して確かめています。
BlinkGTK.WebView の設定用メソッドの使い方以前このページに載っていたコードは、存在しない名前を使っていたため動きませんでした。次のように置き換えてください。
| 以前の書き方 (存在しない) | 正しい書き方 |
|---|---|
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() |
BlinkGTK 1.2.5 以降と、Wayland のデスクトップが必要です (1.2.4 までは Python から起動できません。X11 では動きません)。
Fedora:
sudo dnf install python3-gobject gtk4 blinkgtk-bin blinkgtk-bin-girDebian / 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 の頁を開いたときに異常終了します (理由)。
#!/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())スクリプトでタイトルを書き換えるページを開くと、タイトルが書き換わらないこと (スクリプトが実行されないこと) を確かめられます。
#!/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()
で開いた頁には反映されませんでした。
BlinkGTK.WebView ごとに独立していますreload()
で読み込み直すと反映されます。ただし書体
(set_font_family()) と最小の文字サイズ
(set_minimum_font_size())
は、読み込み直さなくても表示中のページにすぐ反映されます| 設定 | 変更 | 取得 | 既定値 |
|---|---|---|---|
| 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 |
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 '無効'}")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()) # Noneget_user_agent() は、set_user_agent()
で設定した文字列を返します。設定していなければ None
です。
設定は、このあと読み込む頁と reload() した頁に反映されます
(上の注意)。
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 '無効'}")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 '無効'}")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"))BlinkGTK.FontGeneric には
STANDARD・SERIF・SANS_SERIF・MONOSPACE
がありますfc-list : family で確かめられます)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())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}")with 文で設定を変え、ブロックを抜けたら元に戻す書き方
(コンテキストマネージャ) は使わないでください。
load_uri()
はすぐに戻り、読み込みはその後に進むため、ブロックを抜けた時点で設定を戻すと、どちらの設定で読み込まれるかが決まりません。
読み込みごとに設定を変えたいときは、設定してから load_uri()
または reload() を呼びます。
#!/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 と画像を止めて、ページを読み込み直します。
設定の組み合わせをデータクラスで定義し、ドロップダウンで切り替えます。
#!/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())JavaScript・画像・ローカルストレージをそれぞれのスイッチで切り替える例は、イベント処理チュートリアル の完全なブラウザにあります。
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)主な違い:
WebView
のメソッドで直接設定しますBlinkGTK.gtk_init()
を呼び、BlinkGTK.gtk_application_run()
で回す必要がありますこのチュートリアルでは、Python/PyGObject で BlinkGTK の設定を使う方法を学びました。
作成者: BlinkGTK開発チーム
ライセンス: BSD 3-Clause
フィードバック: daisy19@gmail.com