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

如何在GTK和Python中获取小部件的背景色?,gtk,gtk3,pygobject,Gtk,Gtk3,Pygobject,我想获得一个小部件的正常背景色(在本例中为GtkHeaderBar)。我目前正在使用 style = self.get_titlebar().get_style_context() 要获得风格,以及 color = style.get_property("background-color", Gtk.StateFlags.NORMAL) 获取与该样式关联的背景色 但是,它返回具有以下属性的Gkd.RGBA对象: Gdk.RGBA(red=0.000000, green=0.000000, b

我想获得一个小部件的正常背景色(在本例中为
GtkHeaderBar
)。我目前正在使用

style = self.get_titlebar().get_style_context()
要获得风格,以及

color = style.get_property("background-color", Gtk.StateFlags.NORMAL)
获取与该样式关联的背景色

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

Gdk.RGBA(red=0.000000, green=0.000000, blue=0.000000, alpha=0.000000)
但是如果我打开GTK Inspector,选择HeaderBar,然后转到样式属性,它会显示

background-color | rgb(57,63,63) | gtk-contained-dark.css:1568.29
我要做什么才能得到这些相同的值

编辑:

我正在试验
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")

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

您应该看看如何使用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
)
和css文件,如:

GtkHeaderbar {
    background-color:@theme_bg_color;
}
编辑:正如您所评论的,您不想修改背景色,而是要检索背景色的值。您可以执行
widget.get\u style\u context().get\u background\u color()
操作,它将返回类似于
Gdk.RGBA的内容(红色=0.913725,绿色=0.913725,蓝色=0.913725,alpha=1.000000)


但是,您应该注意,
get\u background\u color()
不推荐使用,因为没有一种背景色。一些小部件使用渐变作为背景,因此使用此方法不是最佳解决方案。请参阅参考。

如果有人感兴趣,我认为问题在于:

backg = Gtk.render_background(style, contx, 10, 10, 10, 10)
虽然它应该是:

backg = Gtk.render_background(style, contx, 0, 0, 10, 10)

你走的是对的,但是有一个新的推荐方法来获得颜色

返回到不推荐使用的
get\u background\u color()

请注意,除非已使用
Gtk.StyleContext.save()保存样式上下文,否则不建议传递除self当前状态之外的状态

因此,当前推荐的获取小部件背景颜色的方法是

context = widget.get_style_context()
color = context.get_background_color(widget.get_state())
通常情况下,
self
是一个Gtk小部件,这将成为

context = self.get_style_context()
color = context.get_background_color(self.get_state())

对不起,我不想用css修改背景色。我想得到当前的背景色。是的,我知道
get\u background\u color()
。但是,它总是返回
rgba(0,0,0,0)
。可能是因为小部件使用了渐变…-1,这并不能回答问题,
get\u background\u color()
被弃用,并且不支持除素色以外的背景,如果不是经常的话,情况并非如此。如今,大多数按钮、栏甚至窗口背景都显示出渐变特征。偶然发现这一点是多么困难啊。现在我终于可以用不同的主题颜色来绘制我的小部件了。谢谢。这不是主要问题(参见我的答案),但这确实是
render\u background
结果图像大小为零的原因。抢手货
context = self.get_style_context()
color = context.get_background_color(self.get_state())