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

11

我想获取小部件(在这种情况下是 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检视器,选择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)图像。

3个回答

5
你应该查看使用 CSS 修改背景颜色。这里有一份非常好的文档可以参考,链接如下:https://developer.gnome.org/gtk3/3.6/GtkCssProvider.html。它可与 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_style_context().get_background_color(),它将返回类似于Gdk.RGBA(red=0.913725, green=0.913725, blue=0.913725, alpha=1.000000)的内容。
然而,您应该注意,由于没有一个背景颜色,get_background_color()已被弃用。一些小部件使用渐变作为背景,因此使用此方法并不是最好的解决方案。请参见文档以供参考。

1
抱歉,我不想用CSS修改背景颜色。我想获取当前的背景颜色。 - user3474251
是的,我知道get_background_color()。但它总是返回rgba(0, 0, 0, 0)。可能是因为小部件正在使用渐变... - user3474251
3
-1,这并没有回答问题,而且get_background_color()已经被弃用了,也不支持除纯色以外的背景,而这种情况并不少见。现在大多数按钮、工具栏甚至窗口背景都显示渐变特性。 - ElementW
找到这个真是太难了。现在我终于可以用不同的主题颜色来绘制我的小部件了。谢谢。 - sezanzeb

2

你的想法是对的,但是使用新的推荐方法获取颜色时出现了问题

推荐解决方法是回退到已弃用的get_background_color()函数。

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
import sys

window = Gtk.Window()
context = window.get_style_context()
# this one is buggy
color1 = context.get_property("background-color", Gtk.StateFlags.NORMAL)
print(color1)
# this is the deprecated version, but it is the recommended workaround
color2 = context.get_background_color(Gtk.StateFlags.NORMAL)
print(color2)

python/Gtk文档中,

请注意,除非使用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())

1
如果有人感兴趣,我认为问题在这里:
backg = Gtk.render_background(style, contx, 10, 10, 10, 10)

应该是:

while

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

这不是主要问题(请参见我的答案),但这确实是为什么render_background生成的图像大小为零的原因。很好地发现了! - ederag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接