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

问题描述 投票:5回答:3

我想得到一个小部件的正常背景颜色(在这种情况下是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.pngrgba(0, 0, 0, 0)图像。

gtk gtk3 pygobject
3个回答
3
投票

你应该看看用css修改背景颜色。它有一个非常好的documentation。它可以和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()。某些小部件使用渐变作为背景,因此它不是使用此方法的最佳解决方案。请参阅documentation以供参考。


1
投票

如果有人有兴趣,我认为问题出在这里:

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

虽然它应该是:

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

0
投票

你是在正确的轨道上,但有一个issue与新的推荐方式来获得颜色。

recommended workaround将回归到被弃用的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 documentation

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

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

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())
© www.soinside.com 2019 - 2024. All rights reserved.