一、GTK4——Python运行
以前学习的过程中,使用的 Glib
和 Gtk4
都是使用 C语言
版本。这些库也支持其他语言编写,Python、JavaScript、Vala等。
比如Python运行GTK4,通过 PyGObject提供的gi
获取 Gtk-4.0.typelib
,最终链接到 libgtk-4.so
。
1 GObject Introspection Repository
GObject Introspection Repository (GIR) 是 GNOME 开发中的一个重要工具,用于描述和提供 GObject 类型系统的信息。这些信息包括类、对象、方法、属性等的结构和特性,以及它们在底层 C 语言中的实现细节。
GIR 的主要作用是为各种编程语言(如Python、JavaScript、Vala等)生成绑定(bindings),使得这些语言可以与 GNOME 库进行交互和使用。它通过解析 GObject 类型系统的头文件,并生成对应的元数据描述文件(.gir 文件),从而使得开发者可以在其他语言中直接调用和使用 GNOME 库的功能,而无需手动编写对应的绑定代码。
通过 GObject Introspection,开发者可以更方便地利用 GNOME 开发的丰富功能和工具来构建应用程序,同时也促进了跨语言开发和互操作性。
GObject Introspection 提供以下工具:
-
g-ir-scanner:通过解析头文件、包含注释的 GTK-Doc 注释块和 GObject 库,生成 GIR XML 文件的工具。(通过扫描头文件,生成包含类、方法、属性、信号等详细信息XML格式的
.gir
文件) -
g-ir-compiler:一个 typelib 编译器。它将一个或多个 GIR 文件转换为一个或多个 typelib blob。(编译
.gir
文件生成二进制.typelib
文件) -
g-ir-generate:使用存储库 API 生成 GIR 文件的工具。它从共享对象或原始 typelib blob 中的二进制 typelib 生成 GIR 文件。(从二进制文件
.typelib
生成.gir
文件) -
g-ir-annotation-tool:从源代码文件中提取注释。 g-ir-doc-tool:从 GIR XML 文件生成 API 参考文档。
1.1 g-ir-scanner
以 libadwaita
为例,通过 g-ir-scanner
命令生成了 XML 格式的 Adw-1.gir
文件。
通过查看 Adw-1.gir
文件,我们可以看到,关于命名空间、版本、需要链接的动态库一些信息。
gir文件路径
gir搜索路径的相关环境变量是:XDG_DATA_DIRS
,查看该环境变量可以发现:
实际文件搜索路径应该是: /usr/share/gir-1.0
,在环境变量赋值的时候会省略 gir-1.0
。
我们打开 /usr/share/gir-1.0
,发现刚才安装的 Adw-1.gir
文件。
一般只在其他软件编译的时候,可能要搜索相关的 .gir
文件。
1.2 g-ir-compiler
以 libadwaita
为例,通过 g-ir-compiler
命令生成了二进制 Adw-1.typelib
文件。该二进制文件会在其他高级编程语言,比如python、JavaScript、Vala中使用。(比如python,其实准确来说是通过gi,加载该二进制文件,最后调用相关动态库)
-
该文件一般是被安装到
/usr/lib/x86_64-linux-gnu/girepository-1.0/
。 -
可以通过环境变量指定
GI_TYPELIB_PATH
,指定*.typelib
文件搜索路径。
1.3 g-ir-generate
这个命令是把二进制 *.typelib
文件,转换成 XML 格式的 *.gir
文件。我们以 WebKit2-4.1.typelib
为例。
编译 cambalache
的时候,会提示 gi.repository.WebKit2
没有找到。
我们通过 apt download gir1.2-webkit2-4.1
下载后发现,里面只有一个 WebKit2-4.1.typelib
二进制文件,并没有相关库,我们可以通过命令 g-ir-generate
查看具体依赖那些库。
发现需要的是 libwebkit2gtk-4.1.so.0
和 libjavascriptcoregtk-4.1.so.0
库文件。
1.4 构建文件使能introspection
比如 Gtk4
和 adwaita
,只有在编译选项里面使能 introspection
,就会编译生成相关的 .gir
和 .typelib
文件。
2 PyGObject
PyGObject 是一个 Python 包,它基于 GObject 的库提供绑定,这些库包括 GTK、GStreamer、WebKitGTK、GLib、GIO 等。
它支持 Linux、Windows 和 macOS,适用于 Python 3.9+ 和 PyPy3。PyGObject(包括此文档)是根据 LGPLv2.1+ 许可证发布的。
可以通过 gi
导入 Adw-1.typelib
,进而引用 libadwaita库
.
2.1 PyGObject下载链接
- apt下载
sudo apt install -y python3-gi
- 源码编译下载:https://gitlab.gnome.org/GNOME/pygobject/-/tags
2.3 PyGObject会安装那些文件
可以看到 /usr/lib/python3/dist-packages
下面会有 gi
相关组件。
3 Python运行Adw
前面了解了 GIR
,接下来分析一下,如何使用Python运行 Adw
(Adw是基于Gtk4的一个界面库)。
# 新建一个空白窗口
import gi
gi.require_version('Adw', '1')
from gi.repository import Adw
def on_activate(app):
win = Adw.ApplicationWindow(application=app)
win.present()
app = Adw.Application()
app.connect('activate', on_activate)
app.run(None)
-
Adw-1.typelib
就是gi.require_version('Adw', '1')
,搜索路径是在/usr/lib/x86_64-linux-gnu/girepository-1.0/
,如果将Adw-1.typelib
改成Adw-2.typelib
,就无法找到。(没有通过其他注册信息去搜索,严格验证名字去找对应的typelib) -
通过
Adw-1.typelib
文件链接到libadwaita-1.so.0
库。(如果我们删除系统里面的该库,python程序也会无法运行,本质上还是调用二进制共享库) -
如果不在系统路径
/usr/lib/x86_64-linux-gnu/girepository-1.0/
,可以使用环境变量GI_TYPELIB_PATH
,指定*.typelib
文件搜索路径。
待总结
C++使用GTK
https://www.gtk.org/docs/language-bindings/cpp
C++使用GObject
https://thinkingeek.com/2023/01/15/wrapping-gobjects-in-cpp/
https://thinkingeek.com/2023/02/04/writing-gobjects-in-cpp/