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

Posted

技术标签:

【中文标题】如何在 GTK 和 Python 中获取小部件的背景颜色?【英文标题】:How to get the background color of a widget in GTK and Python? 【发布时间】:2015-10-16 03:52:19 【问题描述】:

我想获得小部件的正常背景颜色(在本例中为 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) 图像。

【问题讨论】:

【参考方案1】:

你应该看看用 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。

【讨论】:

对不起,我不想用 css 修改背景颜色。我想获取当前的背景颜色。 是的,我知道get_background_color()。但是它总是返回rgba(0, 0, 0, 0)。可能是因为小部件正在使用渐变... -1,这并不能回答问题,get_background_color() 已被弃用,并且不支持纯色以外的背景,即使不是不常见的情况,也不是这种情况。如今,大多数按钮、条形图甚至窗口背景都显示出渐变功能。 偶然发现这一点非常困难。现在我终于可以用不同的主题颜色来绘制我的小部件了。谢谢。【参考方案2】:

如果有人感兴趣,我认为问题出在此处:

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

应该是这样的:

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

【讨论】:

这不是主要问题(见我的回答),但这确实是render_background 结果图像大小为零的原因。好收获!【参考方案3】:

您在正确的轨道上,但有一个 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() 保存,否则不建议传递 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())

【讨论】:

以上是关于如何在 GTK 和 Python 中获取小部件的背景颜色?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GTK 中更新(绘制)一个小部件和仅这个小部件

如何使用 Python 中用 Vala 编写的自定义 GTK 小部件?

如何更改 GTK 容器小部件的大小?

在Pygobject GTK3中使用Gtk.GLArea

无法将 CSS 应用于 GtkEntry 小部件(GTK3 / gi / Python)不工作

GTKmm - 无法将固定大小设置为 Gtk::Scale 小部件