使用Python和GObject反射获取GTK+主题颜色

7 投票
1 回答
1305 浏览
提问于 2025-04-16 20:25

随着GObject自省的引入,通过widget.get_style()方法获取主题颜色的方式不再可用。我想知道在使用GTK+和GObject自省时,如何获取主题颜色。最好是这个解决方案能同时适用于2和3版本,不过如果每个版本有不同的解决方案也可以。

1 个回答

6

我不太确定怎么从gtk+-2.0中获取这些信息,除非你是在一个纯粹的gtk+-2.0环境下。在这种情况下,我觉得旧的GtkStyle方法是可以用的。比如说,假设你不是在像gnome-shell这样的Gtk-3.0环境中运行。

import gi
# make sure you use gtk+-2.0
gi.require_version('Gtk', '2.0')
from gi.repository import Gtk

window = Gtk.Window()

...

style = window.get_style()
print style.lookup_color('fg_color')

我认为在gtk+-2.0环境下,这个方法应该还是有效的。不过我不太确定,因为我的系统是在gnome-shell上运行,没法轻松尝试这个。

不过这个方法已经被淘汰,换成了GtkStyleContext。如果我在像gnome-shell这样的gtk+-3.0环境中使用上面的代码,它会运行,但不会给我想要的信息。我得到的是

(False, <Gdk.Color(red=0, green=0, blue=0)>)

编辑:回头看看,我觉得上面的内容还是给出了正确的信息。fg_color的颜色没有找到,这在结果的第一个条目中显示为False。此外,窗口必须是可见的,才能找到颜色。

如果我想要颜色信息,我应该使用新的GtkStyleContext,比如说

import gi
# make sure you use gtk+-3.0
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

window = Gtk.Window()

...

style_context = window.get_style_context()
print style_context.lookup_color('fg_color')

这将给我一些真实的数据,告诉我'fg_color'已经被找到,因为元组中的第一个条目是True。

(True, <Gdk.Color(red=0.000000, green=0.000000, blue=0.000000, alpha=1.000000)>)

希望这能回答你的问题。

撰写回答