如何在GTK和Python中获取小部件的背景颜色?

use*_*251 5 gtk pygobject gtk3

我想获得小部件的正常背景颜色(GtkHeaderBar在本例中为a).我正在使用

style = self.get_titlebar().get_style_context()
Run Code Online (Sandbox Code Playgroud)

得到的风格,和

color = style.get_property("background-color", Gtk.StateFlags.NORMAL)
Run Code Online (Sandbox Code Playgroud)

获取与该样式关联的背景颜色.

但是它返回Gkd.RGBA具有以下属性的对象:

Gdk.RGBA(red=0.000000, green=0.000000, blue=0.000000, alpha=0.000000)
Run Code Online (Sandbox Code Playgroud)

但是如果我打开GTK Inspector,选择HeaderBar,然后转到样式属性,它显示

background-color | rgb(57,63,63) | gtk-contained-dark.css:1568.29
Run Code Online (Sandbox Code Playgroud)

我需要做些什么来获得这些相同的值?

编辑:

我正在试验GtkStyleContext.render_background(),但我没有成功:

surfc = Cairo.ImageSurface (Cairo.FORMAT_ARGB32, 10, 10)
contx = Cairo.Context(surfc)
style = self.get_titlebar().get_style_context()
backg = Gtk.render_background(style, contx, 10, 10, 10, 10)
surfc.write_to_png("test.png")
Run Code Online (Sandbox Code Playgroud)

生成的文件test.png是rgba(0, 0, 0, 0)图像.

ely*_*ya5 5

你应该看看用 css 修改背景颜色。有一个非常好的文档。它可以与 python 一起使用

css_provider = Gtk.CssProvider()
css_provider.load_from_path('application.css')
Gtk.StyleContext.add_provider_for_screen(
    Gdk.Screen.get_default(),
    css_provider,
    Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
)
Run Code Online (Sandbox Code Playgroud)

和一个 css 文件,如:

GtkHeaderbar {
    background-color:@theme_bg_color;
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如您所评论的,您不想修改背景颜色而是检索它的值。你可以这样做widget.get_style_context().get_background_color(),它会返回类似Gdk.RGBA(red=0.913725, green=0.913725, blue=0.913725, alpha=1.000000).

但是,您应该注意它get_background_color()已被弃用,因为没有一种背景颜色。某些小部件使用渐变作为背景,因此使用此方法不是最佳解决方案。请参阅文档以供参考。

  • -1,这不能回答问题,并且不推荐使用`get_background_color()`,并且不支持纯色以外的背景,这种情况即使不是很少,也是如此。现在大多数按钮、栏甚至窗口背景都显示渐变功能。 (2认同)